﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ПовторноеЧтение = (Кэш <> Неопределено);
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
			МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
			МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
		КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

	// Чтение хранилища значений
	Если ТекущийОбъект.ПисьмоВФорматеHTML Тогда
		СтруктураВложенийПисьмаВФорматеHTML = ТекущийОбъект.КартинкиПисьмаВФорматеHTML.Получить();
		Если СтруктураВложенийПисьмаВФорматеHTML = Неопределено Тогда
			СтруктураВложенийПисьмаВФорматеHTML = Новый Структура;
		КонецЕсли;
		ТекстПисьмаФорматированныйДокумент.УстановитьHTML(ТекущийОбъект.ТекстПисьмаВФорматеHTML, СтруктураВложенийПисьмаВФорматеHTML);
	КонецЕсли;
	
	// Перезаполнение очищаемых данных формы при повторном чтении объекта из БД.
	Если ПовторноеЧтение Тогда
		ЗаполнитьСведенияТаблицыОтчеты();
		ПрочитатьРасписаниеРегламентногоЗадания();
		ДобавитьКомандыДобавленияДополнительныхПараметровТекста();
	КонецЕсли;
	
	ОтобразитьВажность();
	
	Для Каждого Строка Из Объект.Отчеты Цикл
		Строка.НеОтправлятьПустой = Не Строка.ОтправлятьЕслиПустой;
	КонецЦикла;
	
	СоздатьРеквизитЭлементСертификатДляШифрования();
	ВидимостьДоступностьПаролейСертификатов(ЭтотОбъект);
	
	Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") И НЕ Объект.Личная И Объект.ИспользоватьЭлектроннуюПочту Тогда
		СостояниеРассылки = РассылкаОтчетов.ПолучитьСостояниеРассылкиОтчетов(Объект.Ссылка);
		Если СостояниеРассылки.СОшибками Тогда
			Элементы.ЗаголовокПовторнойРассылки.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Рассылка отчетов (%1) была отправлена не всем получателям.'"),
				СостояниеРассылки.ПоследнийЗапускНачало);
			Элементы.ГруппаПовторнаяРассылка.Видимость = Истина;
		Иначе
			Элементы.ГруппаПовторнаяРассылка.Видимость = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	ОбновитьСписокПараметровТекстаПисьмаИФайлов();
	ПреобразоватьПараметрыТекста(Объект, "ПараметрыВПредставление");
	ПреобразоватьПараметрыНастроекОтчетов(Объект, "ПараметрыВПредставление");
	
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ЭтоНовый = Объект.Ссылка.Пустая();
	
	Если ЭтоНовый Тогда
		ОбновитьСписокПараметровТекстаПисьмаИФайлов();
	КонецЕсли;
	
	УстановитьУсловноеОформление();
	
	ТекстОшибкиПриОткрытии = РассылкаОтчетов.ТекстОшибкиПроверкиПраваДобавления();
	Если ЗначениеЗаполнено(ТекстОшибкиПриОткрытии) Тогда
		Возврат;
	КонецЕсли;
		
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// СтандартныеПодсистемы.ВерсионированиеОбъектов
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда
		МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов");
		МодульВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
	
	Если Объект.ПометкаУдаления Тогда
		ТолькоПросмотр = Истина;
	КонецЕсли;
	
	// Удаление варианта "В папку", если не используется интеграция с подсистемой "РаботаСФайлами".
	Если ТипЗнч(Объект.Папка) = Тип("Неопределено") Или ТипЗнч(Объект.Папка) = Тип("Строка") Тогда
		Элементы.ДругойСпособДоставки.СписокВыбора.Удалить(0);
	КонецЕсли;
	
	// Удаление варианта "В сетевой каталог", если режим работы в модели сервиса.
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		СпособДоставкиСетевойКаталог = Элементы.ДругойСпособДоставки.СписокВыбора.НайтиПоЗначению("ИспользоватьСетевойКаталог");
		Элементы.ДругойСпособДоставки.СписокВыбора.Удалить(СпособДоставкиСетевойКаталог);
	КонецЕсли;
	
	Если Не ПравоДоступа("ЖурналРегистрации", Метаданные) Тогда
		Элементы.КомандаСобытияРассылки.Видимость = Ложь;
		Элементы.СобытияРассылки.Видимость = Ложь;
	КонецЕсли;
		
	РассылкаОснование = Параметры.ЗначениеКопирования;
	
	// Используется при загрузке и записи настроек выбранного отчета.
	ИдентификаторТекущейСтрокиТаблицыОтчетов = -1;
	
	СозданКопированием = Не РассылкаОснование.Пустая();
	
	Если ЭтоНовый Тогда
		СоздатьРеквизитЭлементСертификатДляШифрования();
		ОтобразитьВажность();
	КонецЕсли;
	
	// Добавление отчетов в табличную часть.
	Если Параметры.Свойство("ПрисоединяемыеОтчеты") И ТипЗнч(Параметры.ПрисоединяемыеОтчеты) = Тип("Массив") Тогда
		Модифицированность = Истина;
		ДобавитьНастройкиОтчетов(Параметры.ПрисоединяемыеОтчеты);
	КонецЕсли;
	
	Кэш = ПолучитьКэш();
	
	Расписание = Новый РасписаниеРегламентногоЗадания;
	
	РассылкаБылаПерсонализирована = Объект.Персонализирована;
	
	// Чтение
	ЗаполнитьСведенияТаблицыОтчеты();
	ЗаполнитьПустыеШаблоныСтандартными(Объект);
	
	Если ЭтоНовый И Не СозданКопированием Тогда
		УстановитьВидРассылки();
		ВариантРасписания = Неопределено;
		Параметры.Свойство("ВариантРасписания", ВариантРасписания);
		ЗаполнитьРасписаниеПоВарианту(ВариантРасписания);
	Иначе
		ПрочитатьРасписаниеРегламентногоЗадания();
	КонецЕсли;
	
	// Заполнение автора рассылки
	Если ЭтоНовый Тогда
		// Автор рассылки
		ТекущийПользователь = Пользователи.ТекущийПользователь();
		Объект.Автор = ТекущийПользователь;
		Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.ОбычнаяВажностьИнтернетПочтовогоСообщения();
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
		Если Не ЗначениеЗаполнено(Объект.Автор) Тогда
			Отказ = Истина;
			
			ПараметрыЖурнала = Новый Структура;
			ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Открытие формы элемента'", ОбщегоНазначения.КодОсновногоЯзыка()));
			ПараметрыЖурнала.Вставить("Данные", Неопределено);
			ПараметрыЖурнала.Вставить("Метаданные", Метаданные.Справочники.РассылкиОтчетов);
			
			Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 не может быть указан автором рассылки.'"),
				ОбщегоНазначения.ПредметСтрокой(ТекущийПользователь));

			РассылкаОтчетов.ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, Текст);
			
			Возврат;
		КонецЕсли;
		
		// Звездочки для паролей, копируемых из основания.
		Если СозданКопированием Тогда
			АвторОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РассылкаОснование, "Автор");
			Если АвторОснования = ТекущийПользователь Тогда
				УстановитьПривилегированныйРежим(Истина);
				Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(РассылкаОснование,
					"ПарольАрхива, FTPПароль");
				УстановитьПривилегированныйРежим(Ложь);
				Если ЗначениеЗаполнено(Пароли.ПарольАрхива) Тогда
					ПарольАрхиваИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере.
				КонецЕсли;
				Если ЗначениеЗаполнено(Пароли.FTPПароль) Тогда
					FTPПароль = ПарольСкрыт();
					FTPПарольИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере.
				КонецЕсли;
				Если Объект.Личная И ДоступноШифрованиеВложений Тогда
					ПолучателиСертификаты = РассылкаОтчетов.ПолучитьСертификатыШифрованияПолучателейРассылки(Объект.Автор);
					Если ПолучателиСертификаты.Количество() > 0 Тогда
						ЭтотОбъект["СертификатДляШифрования"] = ПолучателиСертификаты[0].СертификатДляШифрования;
						СертификатДляШифрованияИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере.
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		// Сброс на умолчания параметров, копирование которых невозможно.
		Если Не ПарольАрхиваИзменен Тогда
			Объект.ИмяАрхива = Кэш.Шаблоны.ИмяАрхива;
		КонецЕсли;
		Если Не FTPПарольИзменен Тогда
			Объект.FTPЛогин = "";
			Объект.FTPСервер = "";
			Объект.FTPПорт = 21;
			Объект.FTPКаталог = "";
		КонецЕсли;
	Иначе
		УстановитьПривилегированныйРежим(Истина);
		Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Объект.Ссылка, "ПарольАрхива, FTPПароль");
		УстановитьПривилегированныйРежим(Ложь);
		ПарольАрхива = ?(ЗначениеЗаполнено(Пароли.ПарольАрхива), Пароли.ПарольАрхива, "");
		FTPПароль = ?(ЗначениеЗаполнено(Пароли.FTPПароль), ПарольСкрыт(), "");
		Если Объект.Личная И ДоступноШифрованиеВложений Тогда
			ПолучателиСертификаты = РассылкаОтчетов.ПолучитьСертификатыШифрованияПолучателейРассылки(Объект.Автор);
			Если ПолучателиСертификаты.Количество() > 0 Тогда
				ЭтотОбъект["СертификатДляШифрования"] = ПолучателиСертификаты[0].СертификатДляШифрования;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	Пароли = Неопределено;
	
	// Позволяет видеть и управлять некоторыми защищенными параметры рассылки.
	РассылкуРедактируетАвтор = (Объект.Автор = Пользователи.ТекущийПользователь());
	
	// Доступность кнопки добавления дополнительного отчета.
	Элементы.ОтчетыДобавитьДополнительныйОтчет.Доступность = ?(Кэш.ПустоеЗначениеОтчета = Неопределено, Истина, Ложь);
	// СКэш.ПустоеЗначениеОтчета = Неопределено" когда тип реквизита "отчет" составной, 
	//   соответственно используется интеграция с подсистемой Дополнительные отчеты и обработки.
	
	// Доступность автора рассылки.
	Элементы.Автор.Доступность = Пользователи.ЭтоПолноправныйПользователь();
	
	// Список форматов с пометками для форматов по умолчанию.
	СписокФорматовПоУмолчанию = РассылкаОтчетов.СписокФорматов();
	
	// Представление списка форматов по умолчанию.
	СписокФорматовПоУмолчаниюПредставление = "";
	Для Каждого ЭлементСписка Из СписокФорматовПоУмолчанию Цикл
		Если ЭлементСписка.Пометка Тогда
			СписокФорматовПоУмолчаниюПредставление = СписокФорматовПоУмолчаниюПредставление + ?(СписокФорматовПоУмолчаниюПредставление = "", "", ", ") + Строка(ЭлементСписка.Представление);
		КонецЕсли;
	КонецЦикла;
	
	// Список редактирования форматов.
	СписокФорматов = СписокФорматовПоУмолчанию.Скопировать();
	
	// Представление форматов по умолчанию в пределах рассылки.
	ФорматыПоУмолчанию = "";
	Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", Кэш.ПустоеЗначениеОтчета));
	Если Найденные.Количество() = 0 Тогда
		ФорматыПоУмолчанию = СписокФорматовПоУмолчаниюПредставление;
	Иначе
		Для Каждого СтрокаФормат Из Найденные Цикл
			ФорматыПоУмолчанию = ФорматыПоУмолчанию + ?(ФорматыПоУмолчанию = "", "", ", ") + РассылкаОтчетов.ПредставлениеФормата(СтрокаФормат.Формат);
		КонецЦикла;
	КонецЕсли;
	
	// Вложения.
	Если СтруктураВложенийПисьмаВФорматеHTML = Неопределено Тогда
		СтруктураВложенийПисьмаВФорматеHTML = Новый Структура;
	КонецЕсли;
	
	// Для списков получателей и исключенных используется одна табличная часть.
	Элементы.ПустыеНастройки.ОтборСтрок = Новый ФиксированнаяСтруктура("ИндексКартинки", 200);
	
	// Список выбора почтовых адресов автора.
	ПочтовыеАдресаПолучателя(Объект.Автор, Элементы.ВидПочтовогоАдресаАвтора.СписокВыбора);
	
	// Список выбора почтовых адресов автора.
	ПодключитьКэшНастроекЭлектроннойПочты();
	
	// Чтение настроек отчетов из объекта копирования.
	Если СозданКопированием Тогда
		ПрочитатьНастройкиОтчетовОбъектаКопирования();
		ПреобразоватьПараметрыТекста(Объект, "ПараметрыВПредставление");
		ПреобразоватьПараметрыНастроекОтчетов(Объект, "ПараметрыВПредставление");
	КонецЕсли;
	
	// Активизация первой строки
	Если Объект.Отчеты.Количество() > 0 И ИдентификаторТекущейСтрокиТаблицыОтчетов = -1 Тогда
		СтрокаОтчеты = Объект.Отчеты[0];
		ИдентификаторСтроки = СтрокаОтчеты.ПолучитьИдентификатор();
		ТекстОшибки = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки);
		Если ТекстОшибки <> "" Тогда
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки, , "Объект.Отчеты[0].Представление");
		КонецЕсли;
	КонецЕсли;
	
	ВидимостьДоступностьКорректность(ЭтотОбъект);
	ДобавитьКомандыДобавленияДополнительныхПараметровТекста();
	
	ЗафиксироватьЗначенияРеквизитовДоИзменения();
	
	Для Каждого Строка Из Объект.Отчеты Цикл
		Строка.НеОтправлятьПустой = Не Строка.ОтправлятьЕслиПустой;
	КонецЦикла;
	
	Если ПравоДоступа("Изменение", Метаданные.Справочники.РассылкиОтчетов) Тогда
		Элементы.ПарольАрхива.КнопкаВыбора = Истина;
	Иначе
		Элементы.ПарольАрхива.КнопкаВыбора = Ложь;
	КонецЕсли;
	
	ПроверитьНаличиеПериодовВОтчетах();
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.КомандаЗаписатьИЗакрыть.Отображение = ОтображениеКнопки.Картинка;
		Элементы.ДругиеСпособыДоставки.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
		Элементы.ИспользоватьСетевойКаталог.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
		Элементы.ИспользоватьПапку.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
		Элементы.АдресОтветаСкрытыеКопии.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
		Элементы.Переместить(Элементы.ДоставкаПраво, Элементы.СтраницаДополнительно);
		Элементы.Переместить(Элементы.ГруппаПаролиШифрование, Элементы.СтраницаДополнительно);
		Элементы.ФорматыПоУмолчанию.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ПолучателиРассылки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
	КонецЕсли;
		
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если ФормаБылаМодифицированаНаСервере Тогда
		Модифицированность = Истина;
	КонецЕсли;
	Если ЗначениеЗаполнено(ТекстОшибкиПриОткрытии) Тогда
		Отказ = Истина;
		ПоказатьПредупреждение(, ТекстОшибкиПриОткрытии);
		Возврат;
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	Если ЗначениеЗаполнено(ТекстВсплывающегоОповещенияПриОткрытии) Тогда
		ПоказатьОповещениеПользователя(ТекстВсплывающегоОповещенияПриОткрытии, , , БиблиотекаКартинок.ВыполнитьЗадачу)
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	// Проверка данных, которые выведены через реквизиты самой формы.
	Если Не ЗначениеЗаполнено(Объект.Наименование) Тогда
		Отказ = Истина;
		ТекстСообщения = НСтр("ru = 'Не введено наименование.'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.Наименование");
	КонецЕсли;
	Если Объект.ИспользоватьЭлектроннуюПочту И Не Объект.Личная Тогда
		Если Не ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда
			Отказ = Истина;
			ТекстСообщения = НСтр("ru = 'Не выбран тип получателей.'");
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ТипПолучателейРассылки");
		КонецЕсли;
	КонецЕсли;
	
	Если Объект.Подготовлена Тогда
		Если Объект.Отчеты.Количество() = 0 Тогда
			Отказ = Истина;
			ТекстСообщения = НСтр("ru = 'Не выбрано ни одного отчета.'");
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.Отчеты");
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Объект.ПериодичностьРасписания) Тогда
			Отказ = Истина;
			ТекстСообщения = НСтр("ru = 'Не выбрана периодичность запуска.'");
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.ПериодичностьРасписания");
		КонецЕсли;
		
		Если Объект.ИспользоватьFTPРесурс Тогда
			Если Не ЗначениеЗаполнено(Объект.FTPСервер)
				Или Не ЗначениеЗаполнено(Объект.FTPПорт)
				Или Не ЗначениеЗаполнено(Объект.FTPКаталог) Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Не введен FTP адрес.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "FTPСерверИКаталог");
			КонецЕсли;
		КонецЕсли;
		
		Если Объект.ИспользоватьСетевойКаталог Тогда
			Если Не ЗначениеЗаполнено(Объект.СетевойКаталогWindows) Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Не введен сетевой каталог Windows.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.СетевойКаталогWindows");
			КонецЕсли;
			Если Не ЗначениеЗаполнено(Объект.СетевойКаталогLinux) Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Не введен сетевой каталог Linux.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.СетевойКаталогLinux");
			КонецЕсли;
		КонецЕсли;
		
		Если Объект.ИспользоватьПапку Тогда
			Если Не ЗначениеЗаполнено(Объект.Папка) Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Не выбрана папка.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.Папка");
			КонецЕсли;
		КонецЕсли;
		
		Если Объект.ИспользоватьЭлектроннуюПочту Тогда
			Если Объект.Личная Тогда
				Если Не ЗначениеЗаполнено(Объект.ВидПочтовогоАдресаПолучателей) Тогда
					Отказ = Истина;
					ТекстСообщения = НСтр("ru = 'Не выбран почтовый адрес.'");
					ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.ВидПочтовогоАдресаПолучателей");
				КонецЕсли;
			Иначе
				Если Не ПолучателиУказаны(Объект.Получатели) Тогда
					Отказ = Истина;
				КонецЕсли;
				Если Не ЗначениеЗаполнено(Объект.ВидПочтовогоАдресаПолучателей) Тогда
					Отказ = Истина;
					ТекстСообщения = НСтр("ru = 'Не выбран тип почтового адреса получателей.'");
					ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ПолучателиРассылки");
				КонецЕсли;
			КонецЕсли;
			Если Не ЗначениеЗаполнено(Объект.УчетнаяЗапись) Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Не выбрана учетная запись для отправки.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "Объект.УчетнаяЗапись");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Объект.ВыполнятьПоРасписанию Тогда
		Если Объект.ПериодичностьРасписания <> Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное
		   И ЗначениеЗаполнено(Расписание.ВремяКонца)Тогда
			РазностьДатВЧасах = СекундыВЧасы(Расписание.ВремяКонца - Расписание.ВремяНачала);
			Если РазностьДатВЧасах < 4 Тогда
				Отказ = Истина;
				ТекстСообщения = НСтр("ru = 'Время окончания рассылки отчетов должно быть на 4 часа позже времени начала.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ВремяОкончания");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	Если ПараметрыЗаписи = Неопределено Тогда
		ПараметрыЗаписи = Новый Структура;
	КонецЕсли;
	Если Не ПараметрыЗаписи.Свойство("Шаг") Тогда
		Отказ = Истина;
		ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	// Запись настроек текущей строки.
	Если ИдентификаторТекущейСтрокиТаблицыОтчетов <> -1 Тогда
		ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторТекущейСтрокиТаблицыОтчетов);
	КонецЕсли;
	
	// Далее выполняются следующие действия:
	// [1] Сохранение настроек, сделанных пользователем.
	//     Помещение измененных настроек строк в настройки записываемого объекта (хранилище значения).
	//     Анализ выполняется для всех отчетов, если пользователь менял настройки.
	// [2] Поиск незаполненных но обязательных для заполнения настроек.
	//     Анализ выполняется для СКД отчетов, если рассылка подготовлена.
	ПроверитьОбязательные = Объект.Подготовлена;
	// [3] Поиск персонализированных полей, если эта рассылка не персонализирована.
	//     Анализ выполняется для всех отчетов, если пользователь сменил вид рассылки с персонализированной на любой
	//     другой.
	РассылкаНеПерсонализирована = (Не Объект.Персонализирована И РассылкаБылаПерсонализирована);
	Для Каждого СтрокаОтчеты Из Объект.Отчеты Цикл
		
		ОбъектСтрокаОтчеты = ТекущийОбъект.Отчеты.Получить(СтрокаОтчеты.НомерСтроки-1);
		
		Если СтрокаОтчеты.ВнесеныИзменения Тогда
			// [1], [2] и [3] Чтение неинициализированных настроек.
			ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек);
			
			// [1] Запись настроек.
			ОбъектСтрокаОтчеты.Настройки = Новый ХранилищеЗначения(ПользовательскиеНастройки, Новый СжатиеДанных(9));
			
			Если Не ПроверитьОбязательные И Не РассылкаНеПерсонализирована Тогда
				Продолжить;
			КонецЕсли;
			
		Иначе
			
			Если Не ПроверитьОбязательные И Не РассылкаНеПерсонализирована Тогда
				Продолжить;
			КонецЕсли;
			
			// [2] и [3] Чтение неинициализированных настроек.
			Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда
				ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек);
			Иначе
				ПользовательскиеНастройки = ОбъектСтрокаОтчеты.Настройки.Получить();
			КонецЕсли;
			
		КонецЕсли;
		
		// [2] и [3] Инициализация настроек.
		ПараметрыОтчета = ИнициализироватьОтчет(СтрокаОтчеты, Истина, ПользовательскиеНастройки, Ложь);
		НастройкиОтчета = ?(СтрокаОтчеты.СКД, ПараметрыОтчета.КомпоновщикНастроекКД, ПользовательскиеНастройки);
		ОтчетПерсонализирован = Ложь;
		
		// [2] и [3] Анализ СКД отчетов.
		Если СтрокаОтчеты.СКД Тогда
			НастройкиКД = НастройкиОтчета.Настройки;
			ПользовательскиеНастройкиКД = НастройкиОтчета.ПользовательскиеНастройки; // ПользовательскиеНастройкиКомпоновкиДанных
			// [3] Проверка значения настроек.
			Фильтр = Новый Структура("Использование, Значение", Истина, ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов));
			Найденные = ОтчетыКлиентСервер.ЭлементыНастроекОтобранные(ПользовательскиеНастройкиКД, Фильтр);
			Если Найденные.Количество() > 0 Тогда
				ОтчетПерсонализирован = Истина;
			КонецЕсли;
			// [2] Поиск и проверка доступной настройки.
			ЗаполненыВсеОбязательныеНастройки = Истина;
			Для Каждого ПользовательскаяНастройка Из ПользовательскиеНастройкиКД.Элементы Цикл
				Если ТипЗнч(ПользовательскаяНастройка) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
					Идентификатор = ПользовательскаяНастройка.ИдентификаторПользовательскойНастройки;
					ОбщаяНастройка = ОтчетыКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору(НастройкиКД, Идентификатор);
					Если ОбщаяНастройка = Неопределено Тогда 
						Продолжить;
					КонецЕсли;
					ДоступнаяНастройка = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(НастройкиКД, ОбщаяНастройка);
					Если ДоступнаяНастройка = Неопределено Тогда
						Продолжить;
					КонецЕсли;
					Если Не ДоступнаяНастройка.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда
						И Не ПользовательскаяНастройка.Использование Тогда
						Продолжить;
					КонецЕсли;
					Если ДоступнаяНастройка.ЗапрещатьНезаполненныеЗначения И Не ЗначениеЗаполнено(ПользовательскаяНастройка.Значение) Тогда
						ЗаполненыВсеОбязательныеНастройки = Ложь;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			
			// [2] Вывод ошибки.
			Если Не ЗаполненыВсеОбязательныеНастройки Тогда
				Отказ = Истина;
				ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Для отчета ''%1'' заполнены не все настройки, обязательные для заполнения. Заполните все обязательные настройки или снимите флажок ''Подготовлена''.'"),
					Строка(СтрокаОтчеты.Отчет));
				Поле = "Отчеты["+ Формат(ТекущийОбъект.Отчеты.Индекс(ОбъектСтрокаОтчеты), "ЧН=0; ЧГ=0") +"].Представление";
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ТекущийОбъект, Поле);
			КонецЕсли;
		КонецЕсли;
		
		// [3] Анализ обычных отчетов.
		Если ТипЗнч(НастройкиОтчета) = Тип("ТаблицаЗначений") Тогда
			Найденные = НастройкиОтчета.НайтиСтроки(Новый Структура("Значение, Использование", ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов), Истина));
			Если Найденные.Количество() > 0 Тогда
				ОтчетПерсонализирован = Истина;
			КонецЕсли;
		КонецЕсли;
		Если РассылкаНеПерсонализирована И ОтчетПерсонализирован Тогда
			Отказ = Истина;
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В настройках отчета ''%1'' задан отбор по получателю рассылки. Отключите этот отбор или измените вид рассылки на ''Свой отчет для каждого получателя''.'"),
				Строка(СтрокаОтчеты.Отчет));
			Поле = "Отчеты["+ Формат(ТекущийОбъект.Отчеты.Индекс(ОбъектСтрокаОтчеты), "ЧН=0; ЧГ=0") +"].Представление";
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ТекущийОбъект, Поле);
		КонецЕсли;
		
		Если Объект.Персонализирована И	НЕ ОтчетПерсонализирован Тогда
			Отказ = Истина;
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В настройках отчета ""%1"" не указан отбор по получателю рассылки.'"),
				Строка(СтрокаОтчеты.Отчет));
			Поле = "Отчеты["+ Формат(ТекущийОбъект.Отчеты.Индекс(ОбъектСтрокаОтчеты), "ЧН=0; ЧГ=0") +"].Представление";
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ТекущийОбъект, Поле);
		КонецЕсли;
		
	КонецЦикла;
	
	ТекущийОбъект.КартинкиПисьмаВФорматеHTML = Неопределено;
	Если ТекущийОбъект.ПисьмоВФорматеHTML Тогда
		ТекущийОбъект.ТекстПисьма = СокрЛП(ТекстПисьмаФорматированныйДокумент.ПолучитьТекст());
		Если ТекущийОбъект.ТекстПисьма = "" Тогда
			ТекущийОбъект.ТекстПисьмаВФорматеHTML = "";
		Иначе
			ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекущийОбъект.ТекстПисьмаВФорматеHTML, СтруктураВложенийПисьмаВФорматеHTML);
			Если ТипЗнч(СтруктураВложенийПисьмаВФорматеHTML) = Тип("Структура")
				И СтруктураВложенийПисьмаВФорматеHTML.Количество() > 0 Тогда
				ТекущийОбъект.КартинкиПисьмаВФорматеHTML = Новый ХранилищеЗначения(СтруктураВложенийПисьмаВФорматеHTML, Новый СжатиеДанных(9));
			КонецЕсли;
			ТекущийОбъект.ТекстПисьма = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
		КонецЕсли;
	КонецЕсли;
	
	// Записываем значения
	Если ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда
		Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки));
		Если Найденные.Количество() = 1 Тогда
			ТекущийОбъект.ТипПолучателейРассылки = Найденные[0].ИдентификаторОбъектаМетаданных;
		Иначе
			ТекущийОбъект.ТипПолучателейРассылки = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
		КонецЕсли;
	Иначе
		ТекущийОбъект.ТипПолучателейРассылки = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	КонецЕсли;
	
	// Все операции с регламентными заданиями размещены в модуле объекта.
	Если Объект.ПериодичностьРасписания <> Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное 
		И Не ЗначениеЗаполнено(Расписание.ПериодПовтораВТечениеДня)Тогда
		Расписание.ВремяКонца = '00010101';
	КонецЕсли;
	ТекущийОбъект.ДополнительныеСвойства.Вставить("Расписание", Расписание);
	
	ПреобразоватьПараметрыТекста(ТекущийОбъект, "ПредставлениеВПараметры");
	ПреобразоватьПараметрыНастроекОтчетов(ТекущийОбъект, "ПредставлениеВПараметры");
	
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	ПарольАрхиваИзмененНоСкрыт = ПарольАрхиваИзменен И ПарольАрхива = ПарольСкрыт();
	FTPПарольИзмененНоСкрыт = FTPПарольИзменен И FTPПароль = ПарольСкрыт();
	
	Если (ПарольАрхиваИзмененНоСкрыт Или FTPПарольИзмененНоСкрыт) И ЗначениеЗаполнено(РассылкаОснование) Тогда
		ТекущийПользователь = Пользователи.ТекущийПользователь();
		АвторОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РассылкаОснование, "Автор");
		Если АвторОснования = ТекущийПользователь Тогда
			УстановитьПривилегированныйРежим(Истина);
			Если ПарольАрхиваИзмененНоСкрыт Тогда
				ВременнаяПеременная = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(РассылкаОснование, "ПарольАрхива");
				ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ВременнаяПеременная, "ПарольАрхива");
				ПарольАрхиваИзменен = Ложь;
			КонецЕсли;
			Если FTPПарольИзмененНоСкрыт Тогда
				ВременнаяПеременная = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(РассылкаОснование, "FTPПароль");
				ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ВременнаяПеременная, "FTPПароль");
				FTPПарольИзменен = Ложь;
			КонецЕсли;
			УстановитьПривилегированныйРежим(Ложь);
		КонецЕсли;
		РассылкаОснование = Неопределено;
	КонецЕсли;
	
	Если ПарольАрхиваИзменен Тогда
		УстановитьПривилегированныйРежим(Истина);
		ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ПарольАрхива, "ПарольАрхива");
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;
	
	Если FTPПарольИзменен Тогда
		УстановитьПривилегированныйРежим(Истина);
		ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, FTPПароль, "FTPПароль");
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;
	
	Если ДоступноШифрованиеВложений И СертификатДляШифрованияИзменен Тогда
		РегистрыСведений.СертификатыПолучателейРассылкиОтчетов.СохранитьСертификатДляПолучателяРассылки(
			Объект.Автор, ЭтотОбъект["СертификатДляШифрования"]);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	ПреобразоватьПараметрыТекста(Объект, "ПараметрыВПредставление");
	ПреобразоватьПараметрыНастроекОтчетов(Объект, "ПараметрыВПредставление");
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом

	// Перезаполнение таблиц формы, связанных с таблицами объектов (т.к. таблицы объектов уже перезаполнились).
	ЗаполнитьСведенияТаблицыОтчеты();
	ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторТекущейСтрокиТаблицыОтчетов);
	
	// Обновление изначальных значений реквизитов в кэше.
	ЗафиксироватьЗначенияРеквизитовДоИзменения();
	Для Каждого Строка Из Объект.Отчеты Цикл
		Строка.НеОтправлятьПустой = Не Строка.ОтправлятьЕслиПустой;
	КонецЦикла;
	
	ПроверитьНаличиеПериодовВОтчетах();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПодготовленаПриИзменении(Элемент)
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Подготовлена");
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Расписание"

&НаКлиенте
Процедура ВыполнятьПоРасписаниюПриИзменении(Элемент)
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ВыполнятьПоРасписанию");
КонецПроцедуры

&НаКлиенте
Процедура МесяцыПриИзменении(Элемент)
	Если Элемент <> Неопределено Тогда
		Расписание.Месяцы = ИзменитьСоставМассива(ЭтотОбъект[Элемент.Имя], Кэш.Соответствия.Месяцы[Элемент.Имя], Расписание.Месяцы);
	КонецЕсли;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы");
КонецПроцедуры

&НаКлиенте
Процедура ДниНеделиПриИзменении(Элемент)
	Если Элемент <> Неопределено Тогда
		Расписание.ДниНедели = ИзменитьСоставМассива(ЭтотОбъект[Элемент.Имя], Кэш.Соответствия.ДниНедели[Элемент.Имя], Расписание.ДниНедели);
	КонецЕсли;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ДниНедели");
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРасписание(Команда)

	Если ОбщегоНазначенияКлиент.РазделениеВключено() Тогда
		ОчиститьСообщения();
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Произвольное расписание недоступно при работе через Интернет.'"));
		Возврат;
	КонецЕсли;
		
	ИзменитьРасписаниеВДиалоге();
КонецПроцедуры

&НаКлиенте
Процедура ПериодичностьРасписанияПриИзменении(Элемент)
	
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодичностьРасписания");
	Если Объект.ПериодичностьРасписания = ПредопределенноеЗначение("Перечисление.ПериодичностиРасписанийРассылокОтчетов.Произвольное") 
	   И НЕ ОбщегоНазначенияКлиент.РазделениеВключено() Тогда
		ИзменитьРасписаниеВДиалоге();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ГиперссылкаНачалоКонецМесяцаНажатие(Элемент)
	Если Расписание.ДеньВМесяце = 0 Тогда
		ДеньВМесяце = 1;
		Расписание.ДеньВМесяце = -1;
	Иначе
		Расписание.ДеньВМесяце = -Расписание.ДеньВМесяце;
	КонецЕсли;
	Модифицированность = Истина;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "НачалоКонецМесяца");
КонецПроцедуры

&НаКлиенте
Процедура ВремяНачалаПриИзменении(Элемент)
	Расписание.ВремяНачала = ВремяНачала;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ВремяНачала");
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьПериодПовтораВТечениеДняПриИзменении(Элемент)
	ПериодПовтораВТечениеДня = ?(ИспользоватьПериодПовтораВТечениеДня, 1, 0);
	ВремяОкончания = ?(ИспользоватьПериодПовтораВТечениеДня, ВремяНачала + ЧасыВСекунды(4), '00010101');
	Расписание.ВремяКонца = ВремяОкончания;
	Расписание.ПериодПовтораВТечениеДня = ЧасыВСекунды(ПериодПовтораВТечениеДня);
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодПовтораВТечениеДня");
КонецПроцедуры

&НаКлиенте
Процедура ПериодПовтораВТечениеДняПриИзменении(Элемент)
	Расписание.ПериодПовтораВТечениеДня = ЧасыВСекунды(ПериодПовтораВТечениеДня);
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодПовтораВТечениеДня");
КонецПроцедуры

&НаКлиенте
Процедура ВремяОкончанияПриИзменении(Элемент)
	Расписание.ВремяКонца = ВремяОкончания;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ВремяОкончания");
КонецПроцедуры

&НаКлиенте
Процедура ПериодПовтораДнейПриИзменении(Элемент)
	Расписание.ПериодПовтораДней = ПериодПовтораДней;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодПовтораДней");
КонецПроцедуры

&НаКлиенте
Процедура ДеньМесяцаПриИзменении(Элемент)
	Расписание.ДеньВМесяце = ?(Расписание.ДеньВМесяце >= 0, ДеньВМесяце, -ДеньВМесяце);
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ДеньВМесяце");
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Доставка"

&НаКлиенте
Процедура ТипПолучателейРассылкиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	Если ВыбранноеЗначение = ТипПолучателейРассылки Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ВыбранноеЗначение));
	Если Найденные.Количество() <> 1 Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	// Очистка получателей (если нужно).
	Если Объект.Получатели.Количество() > 0 Тогда
		СтандартнаяОбработка = Ложь;
		
		СтрокаВопроса = НСтр("ru = 'Для продолжения необходимо очистить список получателей.'");
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Очистить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
		Обработчик = Новый ОписаниеОповещения("ТипПолучателейРассылкиОбработкаВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
		
		ПоказатьВопрос(Обработчик, СтрокаВопроса, Кнопки, 60, КодВозвратаДиалога.Да);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТипПолучателейРассылкиПриИзменении(Элемент)
	Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки));
	Если Найденные.Количество() = 1 Тогда
		СтрокаПолучатель = Найденные[0];
		Объект.ТипПолучателейРассылки = СтрокаПолучатель.ИдентификаторОбъектаМетаданных;
		Объект.ВидПочтовогоАдресаПолучателей = СтрокаПолучатель.ОсновнойВидКИ;
		ДобавитьКомандыДобавленияДополнительныхПараметровТекста();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТипПолучателейРассылкиОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ВидПочтовогоАдресаАвтораОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПоказатьЗначение(, Объект.Автор);
КонецПроцедуры

&НаКлиенте
Процедура FTPСерверИКаталогПриИзменении(Элемент)
	ВыбранноеЗначение = РассылкаОтчетовКлиент.РазобратьFTPАдрес(FTPСерверИКаталог);
	FTPСерверИКаталогОбработкаВыбора(Элемент, ВыбранноеЗначение, Истина);
КонецПроцедуры

&НаКлиенте
Процедура FTPСерверИКаталогНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ПараметрыПроизвольнойФормы = Новый Структура("Сервер, Каталог, Порт, Логин, ПассивноеСоединение");
	Для Каждого КлючИЗначение Из ПараметрыПроизвольнойФормы Цикл
		ПараметрыПроизвольнойФормы[КлючИЗначение.Ключ] = Объект["FTP" + КлючИЗначение.Ключ];
	КонецЦикла;
	ПараметрыПроизвольнойФормы.Вставить("Пароль", FTPПароль);
	ПараметрыПроизвольнойФормы.Вставить("Заголовок", НСтр("ru = '<Укажите получателя>'"));
	
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПараметрыFTP", ПараметрыПроизвольнойФормы, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура FTPСерверИКаталогОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если ВыбранноеЗначение = Неопределено Или ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	Для Каждого КлючИЗначение Из ВыбранноеЗначение Цикл
		Если КлючИЗначение.Ключ = "Пароль" Тогда
			Если КлючИЗначение.Значение <> FTPПароль И КлючИЗначение.Значение <> ПарольСкрыт() Тогда
				FTPПароль = КлючИЗначение.Значение;
				FTPПарольИзменен = Истина;
			КонецЕсли;
		Иначе
			Объект["FTP" + КлючИЗначение.Ключ] = КлючИЗначение.Значение;
		КонецЕсли;
	КонецЦикла;
	
	ВидимостьДоступностьКорректность(ЭтотОбъект, "FTPСерверИКаталог");
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура FTPСерверИКаталогОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура FTPСерверИКаталогОткрытие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	
	ПолныйАдрес = "ftp://"+ Объект.FTPСервер +":"+ Формат(Объект.FTPПорт, "ЧН=21; ЧГ=0") + Объект.FTPКаталог;
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ПолныйАдрес);

КонецПроцедуры

&НаКлиенте
Процедура ВидРассылкиПриИзменении(Элемент)
	Объект.Личная            = (ВидРассылки = "Личная");
	Объект.Персонализирована = (ВидРассылки = "Персонализирована");
	
	Если Не Объект.ВставлятьОтчетыВТекстПисьма И НЕ Объект.ТолькоУведомить Тогда
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
	КонецЕсли;
	
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ВидРассылки");
	ДобавитьКомандыДобавленияДополнительныхПараметровТекста();
	
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьЭлектроннуюПочтуПриИзменении(Элемент)
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ИспользоватьЭлектроннуюПочту");
	
	Если Не Публиковать И Не Объект.ИспользоватьЭлектроннуюПочту Тогда
		Публиковать = Истина;
		ВычислитьФлажкиДополнительныхСпособовДоставки();
		ВидимостьДоступностьКорректность(ЭтотОбъект, "Публиковать");
	ИначеЕсли Объект.ИспользоватьЭлектроннуюПочту И НЕ Объект.ВставлятьОтчетыВТекстПисьма И НЕ Объект.ТолькоУведомить Тогда
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТолькоУведомитьПриИзменении(Элемент)
	
	Если Объект.ТолькоУведомить Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
		Объект.ПрикреплятьОтчетыВоВложения = Ложь;
	Иначе
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
	КонецЕсли;
	
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ТолькоУведомить");
КонецПроцедуры

&НаКлиенте
Процедура ДругойСпособДоставкиПриИзменении(Элемент)
	ВычислитьФлажкиДополнительныхСпособовДоставки();
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ДругойСпособДоставки");
КонецПроцедуры

&НаКлиенте
Процедура ДругойСпособДоставкиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	Если ПустаяСтрока(Текст) Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПубликоватьПриИзменении(Элемент)
	ВычислитьФлажкиДополнительныхСпособовДоставки();
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Публиковать");
	
	Если Не Публиковать И Не Объект.ИспользоватьЭлектроннуюПочту Тогда
		Объект.ИспользоватьЭлектроннуюПочту = Истина;
		Объект.ПрикреплятьОтчетыВоВложения  = Истина;
		ВидимостьДоступностьКорректность(ЭтотОбъект, "ИспользоватьЭлектроннуюПочту");
	ИначеЕсли Объект.ИспользоватьЭлектроннуюПочту И НЕ Объект.ВставлятьОтчетыВТекстПисьма И НЕ Объект.ТолькоУведомить Тогда
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПапкаОткрытие(Элемент, СтандартнаяОбработка)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
		МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент");
		МодульРаботаСФайламиСлужебныйКлиент.РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Объект.Папка);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПапкаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	Если Не ПравоИзмененияПапкиИФайлов(ВыбранноеЗначение) Тогда
		СтандартнаяОбработка = Ложь;
		ТекстПредупреждения = НСтр("ru = 'Недостаточно прав для изменения файлов папки ""%1"".'");
		ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, Строка(ВыбранноеЗначение));
		ПоказатьПредупреждение(, ТекстПредупреждения);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СетевойКаталогWindowsПриИзменении(Элемент)
	Объект.СетевойКаталогWindows = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Объект.СетевойКаталогWindows);
	Если ПустаяСтрока(Объект.СетевойКаталогLinux) Тогда
		Объект.СетевойКаталогLinux = СтрЗаменить(Объект.СетевойКаталогWindows, "\", "/");
	КонецЕсли; 
КонецПроцедуры

&НаКлиенте
Процедура СетевойКаталогLinuxПриИзменении(Элемент)
	Объект.СетевойКаталогLinux = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Объект.СетевойКаталогLinux);
	Если ПустаяСтрока(Объект.СетевойКаталогWindows) Тогда
		Объект.СетевойКаталогWindows = СтрЗаменить(Объект.СетевойКаталогLinux, "/", "\");
	КонецЕсли; 
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Дополнительно"

&НаКлиенте
Процедура ФорматыПоУмолчаниюНажатие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Обработчик = Новый ОписаниеОповещения("ФорматыПоУмолчаниюЗавершениеВыбора", ЭтотОбъект);
	ВыбратьФормат(Кэш.ПустоеЗначениеОтчета, Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура АрхивироватьПриИзменении(Элемент)
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Архивировать");
	ПроверкаПриУстановкеПароляАрхиваВставлятьОтчетыВТекстПисьма();
КонецПроцедуры

&НаКлиенте
Процедура АвторПриИзменении(Элемент)
	ТекущийСписок = Элементы.ВидПочтовогоАдресаАвтора.СписокВыбора;
	ТекущийСписок.Очистить();
	НовыйСписок = Новый СписокЗначений;
	ПочтовыеАдресаПолучателя(Объект.Автор, НовыйСписок);
	Для Каждого ЭлементСписка Из НовыйСписок Цикл
		ЗаполнитьЗначенияСвойств(ТекущийСписок.Добавить(), ЭлементСписка);
	КонецЦикла;
	Если НовыйСписок.НайтиПоЗначению(Объект.ВидПочтовогоАдресаПолучателей) = Неопределено Тогда
		Объект.ВидПочтовогоАдресаПолучателей = Неопределено;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИмяАрхиваОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ВыбранноеЗначение = "НаименованиеДатаРассылки" Тогда
		ДобавитьШаблон();
		СтандартнаяОбработка = Ложь;
		ТекущийЭлемент.ВыделенныйТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеРассылки + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаВыполнения + "()]");

		Переменные = Новый Структура;
		Переменные.Вставить("Элемент", ТекущийЭлемент);
		Переменные.Вставить("СтарыйТекст", "");
		Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеРассылки + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаВыполнения + "("));
		Переменные.Вставить("Постфикс", ")]");
		Переменные.Вставить("ТекстФормата", "");
		Переменные.Вставить("СтарыйФрагментНайден", Ложь);

		Обработчик = Новый ОписаниеОповещения("ДобавитьИзменитьШаблонДатыРассылкиЗавершение", ЭтотОбъект, Переменные);

		Диалог = Новый КонструкторФорматнойСтроки;
		Диалог.ДоступныеТипы = Новый ОписаниеТипов("Дата");
		Диалог.Текст         = Переменные.ТекстФормата;
		Диалог.Показать(Обработчик);		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПарольАрхиваПриИзменении(Элемент)
	ПарольАрхиваИзменен = Истина;
	
	ПроверкаПриУстановкеПароляАрхиваВставлятьОтчетыВТекстПисьма();
	
КонецПроцедуры

&НаКлиенте
Процедура ПарольАрхиваНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	РаботаСПочтовымиСообщениямиКлиент.ПолеПароляНачалоВыбора(Элемент, ПарольАрхива, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СертификатДляШифрованияПриИзменении(Элемент)
	СертификатДляШифрованияИзменен = Истина;

	Если ЗначениеЗаполнено(ЭтотОбъект["СертификатДляШифрования"]) И Объект.ВставлятьОтчетыВТекстПисьма 
		И Объект.ПрикреплятьОтчетыВоВложения Тогда

		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		
		КнопкиВопроса = Новый СписокЗначений;
		КнопкиВопроса.Добавить("УстановитьСертификатДляШифрования", НСтр("ru = 'Установить сертификат для шифрования'"));
		КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
		ТекстВопроса = НСтр(
			"ru = 'Для того чтобы установить сертификат для шифрования, необходимо убрать отчеты из текста письма.'");
		ПараметрыВопроса.КнопкаПоУмолчанию = "УстановитьСертификатДляШифрования";

		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросПарольШифрованиеОтчетыВТекстеПисьма", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПаролиЗашифроватьПриИзменении(Элемент)

	ВидимостьДоступностьПаролейСертификатов(ЭтотОбъект);
	
	Если НЕ Объект.ВставлятьОтчетыВТекстПисьма И Объект.УстановитьПаролиЗашифровать Тогда
		ОткрытьФормуПаролиШифрование();
	ИначеЕсли Объект.ВставлятьОтчетыВТекстПисьма И Объект.УстановитьПаролиЗашифровать Тогда
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
	ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;

		Если ДоступноШифрованиеВложений Тогда
			Если Объект.Архивировать Тогда
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("УстановитьПаролиЗашифровать", НСтр("ru = 'Установить пароли и зашифровать'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы установить пароли и зашифровать, необходимо убрать отчеты из текста письма.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "УстановитьПаролиЗашифровать";
			Иначе
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("УстановитьПаролиЗашифровать", НСтр("ru = 'Зашифровать'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы зашифровать отчеты, необходимо убрать отчеты из текста письма.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "Зашифровать";
			КонецЕсли;
		ИначеЕсли Объект.Архивировать Тогда
			КнопкиВопроса = Новый СписокЗначений;
			КнопкиВопроса.Добавить("УстановитьПаролиЗашифровать", НСтр("ru = 'Установить пароли'"));
			КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
			ТекстВопроса = НСтр("ru = 'Для того чтобы установить пароли, необходимо убрать отчеты из текста письма.'");
			ПараметрыВопроса.КнопкаПоУмолчанию = "УстановитьПароли";
		КонецЕсли;
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросУстановитьПаролиОтчетыВТекстеПисьма", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыОтчеты

&НаКлиенте
Процедура ОтчетыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	СтруктураЗаполнения = Новый Структура;
	СтруктураЗаполнения.Вставить("Форматы", "");
	СтруктураЗаполнения.Вставить("ОтправлятьЕслиПустой", Ложь);
	СтруктураЗаполнения.Вставить("НеОтправлятьПустой", Истина);
	СтруктураЗаполнения.Вставить("Доступность", Истина);  
	СтруктураЗаполнения.Вставить("ШаблонНаименования", "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета
		+ "] [" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]");
	
	МассивНовыхСтрок = ВыборПодборПеретаскиваниеВТабличнуюЧасть(
		ВыбранноеЗначение,
		Объект.Отчеты,
		"Отчет",
		СтруктураЗаполнения,
		Истина);
	
	Шаблон = Новый ФиксированнаяСтруктура("Количество, МассивСтрок, ПредставлениеОтчетов, Текст", 0, Неопределено, "");
	СтруктураВыбора = Новый Структура;
	СтруктураВыбора.Вставить("Выбрано",   Новый Структура(Шаблон));
	СтруктураВыбора.Вставить("Успешно",   Новый Структура(Шаблон));
	СтруктураВыбора.Вставить("СОшибками", Новый Структура(Шаблон));
	СтруктураВыбора.Выбрано.МассивСтрок   = МассивНовыхСтрок;
	СтруктураВыбора.Успешно.МассивСтрок   = Новый Массив;
	СтруктураВыбора.СОшибками.МассивСтрок = Новый Массив;
	
	// Инициализация добавленных строк отчетов и заполнение структуры выбора.
	ПроверитьДобавленныеСтрокиОтчетов(СтруктураВыбора);
	
	Если СтруктураВыбора.СОшибками.Количество > 0 Тогда
		
		Если СтруктураВыбора.Выбрано.Количество = 1 Тогда
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось включить отчет в рассылку по причине:
					|%1'"), СтруктураВыбора.СОшибками.Текст);
		ИначеЕсли СтруктураВыбора.Успешно.Количество = 0 Тогда
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось включить отчеты в рассылку по причине:
					|%1'"), СтруктураВыбора.СОшибками.Текст);
		Иначе
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В рассылку включено отчетов: %1 из %2
					|Подробности:
					|%3'"),
				Формат(СтруктураВыбора.Успешно.Количество, "ЧН=0; ЧГ="),
				Формат(СтруктураВыбора.Выбрано.Количество, "ЧН=0; ЧГ="), 
				СтруктураВыбора.СОшибками.Текст);
		КонецЕсли;
		ПоказатьПредупреждение(Неопределено, ТекстСообщения);
		
	Иначе
		
		Если СтруктураВыбора.Успешно.Количество = 0 Тогда
			ЗаголовокОповещения = Неопределено;
			ТекстОповещения = НСтр("ru = 'Все выбранные отчеты уже включены в рассылку.'");
		Иначе
			Если СтруктураВыбора.Выбрано.Количество = 1 Тогда
				ЗаголовокОповещения = НСтр("ru = 'Отчет включен в рассылку'");
			Иначе
				ЗаголовокОповещения = НСтр("ru = 'Отчеты включены в рассылку'");
			КонецЕсли;
			ТекстОповещения = СтруктураВыбора.Успешно.ПредставлениеОтчетов;
		КонецЕсли;
		
		ПоказатьОповещениеПользователя(
			ЗаголовокОповещения,
			,
			ТекстОповещения,
			БиблиотекаКартинок.Успешно32);
		
	КонецЕсли;
	ПроверитьНаличиеПериодовВОтчетах(СтруктураВыбора.Успешно.МассивСтрок);
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Отчеты");
КонецПроцедуры

&НаКлиенте
Процедура ОтчетыПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ОбработчикАктивизацииСтрокиТаблицыОтчеты", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикАктивизацииСтрокиТаблицыОтчеты()
	СтрокаОтчеты = Элементы.Отчеты.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.ПустаяСтраница;
		Возврат;
	КонецЕсли;
	
	ИдентификаторСтроки = СтрокаОтчеты.ПолучитьИдентификатор();
	Если ИдентификаторСтроки = ИдентификаторТекущейСтрокиТаблицыОтчетов Тогда
		Возврат;
	КонецЕсли;
	
	ТекстПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки);
	Если ТекстПредупреждения <> "" Тогда
		ПоказатьПредупреждение(, ТекстПредупреждения);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОтчетыПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОтчетыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОтчетыПослеУдаления(Элемент)
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Отчеты");
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПользовательскиеНастройки

&НаКлиенте
Процедура ПользовательскиеНастройкиПриИзменении(Элемент)
	СтрокаОтчеты = Элементы.Отчеты.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаОтчеты.ВнесеныИзменения = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПользовательскиеНастройкиПриАктивизацииСтроки(Элемент)
	Если Элементы.СтраницыНастроекОтчета.ТекущаяСтраница <> Элементы.СтраницаКомпоновщик Тогда
		Возврат;
	КонецЕсли;
	Отчет = Элементы.Отчеты.ТекущиеДанные;
	Если Отчет = Неопределено Или ТипЗнч(Отчет.Отчет) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда
		Возврат;
	КонецЕсли;
	ИдентификаторКД = Элементы.ПользовательскиеНастройки.ТекущаяСтрока;
	ТолькоПросмотрЗначения = Ложь;
	РассылкаОтчетовКлиентПереопределяемый.ПриАктивизацииСтрокиНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, ТолькоПросмотрЗначения);
	Если Элементы.ПользовательскиеНастройкиЗначение.ТолькоПросмотр <> ТолькоПросмотрЗначения Тогда
		Элементы.ПользовательскиеНастройкиЗначение.ТолькоПросмотр = ТолькоПросмотрЗначения;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПользовательскиеНастройкиЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	НачалоВыбораПользовательскойНастройки(СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПользовательскиеНастройкиЗначениеОчистка(Элемент, СтандартнаяОбработка)
	Если Элементы.СтраницыНастроекОтчета.ТекущаяСтраница <> Элементы.СтраницаКомпоновщик Тогда
		Возврат;
	КонецЕсли;
	Отчет = Элементы.Отчеты.ТекущиеДанные;
	Если Отчет = Неопределено Или ТипЗнч(Отчет.Отчет) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда
		Возврат;
	КонецЕсли;
	ИдентификаторКД = Элементы.ПользовательскиеНастройки.ТекущаяСтрока;
	РассылкаОтчетовКлиентПереопределяемый.ПриОчисткеНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПользовательскиеНастройкиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	НачалоВыбораПользовательскойНастройки(СтандартнаяОбработка);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыНастройкиТекущегоОтчета

&НаКлиенте
Процедура НастройкиТекущегоОтчетаЗначениеПриИзменении(Элемент)
	СтрокаНастроек = Элементы.НастройкиТекущегоОтчета.ТекущиеДанные;
	Если СтрокаНастроек = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаНастроек.Использование = Истина;
КонецПроцедуры

&НаКлиенте
Процедура НастройкиТекущегоОтчетаПриИзменении(Элемент)
	СтрокаОтчеты = Элементы.Отчеты.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаОтчеты.ВнесеныИзменения = Истина;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыФорматыОтчетов

&НаКлиенте
Процедура ФорматыОтчетовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовФорматыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СтрокаОтчеты = Элементы.ФорматыОтчетов.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Переменные = Новый Структура;
	Переменные.Вставить("СтрокаОтчеты", СтрокаОтчеты);
	
	Обработчик = Новый ОписаниеОповещения("ФорматыОтчетовФорматыЗавершениеВыбора", ЭтотОбъект, Переменные);
	
	ВыбратьФормат(СтрокаОтчеты.Отчет, Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовФорматыОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СтрокаОтчеты = Элементы.ФорматыОтчетов.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьФормат(СтрокаОтчеты.Отчет);
	СтрокаОтчеты.Форматы = "";
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовОтправлятьЕслиПустойПриИзменении(Элемент)
	ТекущиеДанные = Элементы.ФорматыОтчетов.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекущиеДанные.НеОтправлятьПустой = Не ТекущиеДанные.ОтправлятьЕслиПустой;
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовНеОтправлятьПустойПриИзменении(Элемент)
	ТекущиеДанные = Элементы.ФорматыОтчетов.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекущиеДанные.ОтправлятьЕслиПустой = Не ТекущиеДанные.НеОтправлятьПустой;
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовПриАктивизацииСтроки(Элемент)
	
	СтрокаФорматыОтчетов = Элемент.ТекущиеДанные;
	Если СтрокаФорматыОтчетов = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Очистить();
	Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеОтчета", НСтр("ru = 'Наименование отчета'"));
	Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеОтчетаФормат", НСтр("ru = 'Наименование отчета, формат'"));
	Если СтрокаФорматыОтчетов.ЕстьПериод Тогда
		Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеПериод", НСтр("ru = 'Наименование отчета, период'"));
		Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеПериодФормат", НСтр("ru = 'Наименование отчета, период, формат'"));
	КонецЕсли;
	Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеДатаРассылки", НСтр("ru = 'Наименование отчета, дата рассылки'"));
	Элементы.ФорматыОтчетовШаблонНаименования.СписокВыбора.Добавить("НаименованиеДатаРассылкиФормат", НСтр("ru = 'Наименование отчета, дата рассылки, формат'"));

КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовШаблонНаименованияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	УстановитьШаблоныНаименований(ВыбранноеЗначение);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

////////////////////////////////////////////////////////////////////////////////
// Командная панель

&НаКлиенте
Процедура КомандаЗаписатьИЗакрыть(Команда)
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("ИмяКоманды", "КомандаЗаписатьИЗакрыть");
	ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура ПолучателиРассылкиНажатие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Если Не ЗначениеЗаполнено(Объект.ТипПолучателейРассылки) Тогда
		ТекстОшибки = НСтр("ru = 'Для ввода получателей выберите их тип.'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстОшибки, , "ТипПолучателейРассылки");
		Возврат;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ПолучателиРассылкиНажатиеЗавершение", ЭтотОбъект);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Получатели", Объект.Получатели);
	ПараметрыФормы.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки);
	ПараметрыФормы.Вставить("ВидПочтовогоАдресаПолучателей", Объект.ВидПочтовогоАдресаПолучателей);
	ПараметрыФормы.Вставить("НаименованиеРассылки", Объект.Наименование);
	
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПолучателиРассылки", ПараметрыФормы, , , , , Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаписать(Команда)
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("ИмяКоманды", "КомандаЗаписать");
	ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыполнитьСейчас(Команда)
	Если Не Объект.Подготовлена Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Рассылка не подготовлена.'"));
		Возврат;
	КонецЕсли;
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("ИмяКоманды", "КомандаВыполнитьСейчас");
	ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура КомандаСобытияРассылки(Команда)
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("ИмяКоманды", "КомандаСобытияРассылки");
	ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура ПовторнаяРассылка(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Ссылка", Объект.Ссылка);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияПовторнойРассылки", ЭтотОбъект);
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПовторнаяРассылкаОтчетов", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Отчеты"

&НаКлиенте
Процедура ДобавитьОтчет(Команда)
	ВыбранныеЗначения = Новый СписокЗначений;
	Для Каждого СтрокаОтчеты Из Объект.Отчеты Цикл
		Если ТипЗнч(СтрокаОтчеты.Отчет) = Тип("СправочникСсылка.ВариантыОтчетов") Тогда
			ВыбранныеЗначения.Добавить(СтрокаОтчеты.Отчет);
		КонецЕсли;
	КонецЦикла;
	
	ОтборВыбора = Новый Структура;
	ОтборВыбора.Вставить("ТипОтчета", 1);
	ОтборВыбора.Вставить("Отчет", Новый Структура("Вид, Значение", "НеВСписке", Кэш.ИсключаемыеОтчеты));
	
	ПараметрыФормыВыбора = Новый Структура;
	ПараметрыФормыВыбора.Вставить("РежимОткрытияОкна",  РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	ПараметрыФормыВыбора.Вставить("РежимВыбора",        Истина);
	ПараметрыФормыВыбора.Вставить("МножественныйВыбор", Истина);
	ПараметрыФормыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь);
	ПараметрыФормыВыбора.Вставить("Отбор",              ОтборВыбора);
	ПараметрыФормыВыбора.Вставить("ВыбранныеЗначения",  ВыбранныеЗначения);
	
	ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаВыбора", ПараметрыФормыВыбора, Элементы.Отчеты);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьДополнительныйОтчет(Команда)
	// Форма подбора дополнительных отчетов.
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
		МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент");
		МодульДополнительныеОтчетыИОбработкиКлиент.РассылкаОтчетовПодборДопОтчета(Элементы.Отчеты);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПредварительныйПросмотрОтчета(Команда)
	
	ОчиститьСообщения();
	
	СтрокаОтчеты = Элементы.Отчеты.ТекущиеДанные;
	Если СтрокаОтчеты = Неопределено Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите отчет'"));
		Возврат;
	КонецЕсли;
	Если Не СтрокаОтчеты.Доступность Тогда
		ПоказатьПредупреждение(, СтрокаОтчеты.Представление);
		Возврат;
	КонецЕсли;
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("Отчет",                СтрокаОтчеты.Отчет);
	ПараметрыОтчета.Вставить("Настройки",            Неопределено);
	ПараметрыОтчета.Вставить("ОтправлятьЕслиПустой", СтрокаОтчеты.ОтправлятьЕслиПустой);
	ПараметрыОтчета.Вставить("Форматы",              Новый Массив);
	ПараметрыОтчета.Вставить("Представление",        СтрокаОтчеты.Представление);
	ПараметрыОтчета.Вставить("ПолноеИмя",            СтрокаОтчеты.ПолноеИмя);
	ПараметрыОтчета.Вставить("КлючВарианта",         СтрокаОтчеты.КлючВарианта);
	
	Если СтрокаОтчеты.СКД Тогда
		ПараметрыОтчета.Настройки = КомпоновщикНастроекКД.ПользовательскиеНастройки;
	Иначе
		Настройки = Новый Массив;
		Найденные = НастройкиТекущегоОтчета.НайтиСтроки(Новый Структура("Использование", Истина));
		Для Каждого СтрокаНастройка Из Найденные Цикл
			ДобавляемаяНастройка = Новый Структура("Реквизит, Значение", СтрокаНастройка.Реквизит, СтрокаНастройка.Значение);
			Настройки.Добавить(ДобавляемаяНастройка);
		КонецЦикла;
		ПараметрыОтчета.Настройки = Настройки;
	КонецЕсли;
	
	Если Объект.Персонализирована Тогда
		Если Не ПолучателиУказаны(Объект.Получатели) Тогда
			Возврат;
		КонецЕсли;
		Обработчик = Новый ОписаниеОповещения("ПредварительныйПросмотрОтчетаПродолжение", ЭтотОбъект, ПараметрыОтчета);
		РассылкаОтчетовКлиент.ВыбратьПолучателя(Обработчик, Объект, Ложь, Ложь);
	Иначе
		ПредварительныйПросмотрОтчетаПродолжение(Неопределено, ПараметрыОтчета);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПредварительныйПросмотрОтчетаПродолжение(РезультатВыбора, ПараметрыОтчета) Экспорт
	ПользовательскиеНастройкиКД = ПараметрыОтчета.Настройки;
	Фильтр = Новый Структура("Использование, Значение", Истина, ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов));
	ПерсонализированныеНастройки = ОтчетыКлиентСервер.ЭлементыНастроекОтобранные(ПользовательскиеНастройкиКД, Фильтр);
	Если Объект.Персонализирована Тогда
		Если РезультатВыбора = Неопределено Тогда
			Возврат;
		Иначе
			Получатель = РезультатВыбора.Получатель;
		КонецЕсли;
		Для Каждого ПользовательскаяНастройкаКД Из ПерсонализированныеНастройки Цикл
			Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
				ПользовательскаяНастройкаКД.ПравоеЗначение = Получатель;
			ИначеЕсли ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
				ПользовательскаяНастройкаКД.Значение = Получатель;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройкиКД);
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
	
	ВариантыОтчетовКлиент.ОткрытьФормуОтчета(ЭтотОбъект, ПараметрыОтчета.Отчет, ПараметрыФормы);
	
	Для Каждого ПользовательскаяНастройкаКД Из ПерсонализированныеНастройки Цикл
		Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			ПользовательскаяНастройкаКД.ПравоеЗначение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
		ИначеЕсли ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
			ПользовательскаяНастройкаКД.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УказатьПолучателяРассылки(Команда)
	ОчиститьСообщения();
	
	// Проверка - включена ли возможность персонализации рассылки.
	Если Не Объект.Персонализирована Тогда
		ПредставлениеВида = Элементы.ВидРассылки.СписокВыбора.НайтиПоЗначению("Персонализирована").Представление;
		СообщениеТекст = НСтр("ru = 'Использовать получателя в параметрах возможно только для вида рассылки ""%1"".'");
		СообщениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеТекст, ПредставлениеВида);
		ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеТекст, , "ВидРассылки");
		Возврат;
	КонецЕсли;
	
	// Получение основного типа получателей.
	КоличествоТипов = ТипПолучателейРассылки.Типы().Количество();
	Если КоличествоТипов <> 1 И КоличествоТипов <> 2 Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Поле ""Получатели"" не заполнено.'"), , "ТипПолучателейРассылки");
		Возврат;
	КонецЕсли;
	
	НайденныеИдентификаторыОбъектовМетаданных = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки));
	Если НайденныеИдентификаторыОбъектовМетаданных.Количество() <> 1 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Некорректный тип получателей.'"));
		Возврат;
	КонецЕсли;
	
	МассивТипов = НайденныеИдентификаторыОбъектовМетаданных[0].ОсновнойТип.Типы();
	Если МассивТипов.Количество() <> 1 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Некорректный тип получателей.'"));
		Возврат;
	КонецЕсли;
	
	ОсновнойТипПолучателей = МассивТипов[0];
	
	Настройка = ОпределитьНастройку();
	Если Настройка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Проверка на содержание типа получателей.
	Если Не Настройка.ОписаниеДоступныхТипов.СодержитТип(ОсновнойТипПолучателей) Тогда
		ТекстПредупреждения = НСтр("ru = 'Тип ""%1"" не подходит по типу к выбранной настройке.
			|Выберите другой тип получателей рассылки или другую настройку.'");
		ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, Строка(ОсновнойТипПолучателей));
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Возврат;
	КонецЕсли;
	
	Настройка.Инициатор.ЗакончитьРедактированиеСтроки(Ложь);
	Настройка.СтрокаНастроек.Использование = Истина;
	Если Настройка.СКД Тогда
		Если Настройка.ЭтоЭлементОтбора Тогда
			Если Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
				Или Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии
				Или Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
				Или Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
				Или Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии
				Или Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда
				Настройка.СтрокаНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
			КонецЕсли;
			Настройка.СтрокаНастроек.ПравоеЗначение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
		Иначе
			Настройка.СтрокаНастроек.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
		КонецЕсли;
	Иначе
		Настройка.СтрокаНастроек.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
	КонецЕсли;
	
	НайтиНастройкиПерсонализации();
	
	РассылкаБылаПерсонализирована = Истина;
	Элементы.Отчеты.ТекущиеДанные.ВнесеныИзменения = Истина;
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьПолучателяРассылки(Команда)
	ОчиститьСообщения();
	
	Настройка = ОпределитьНастройку();
	Если Настройка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройка.Инициатор.ЗакончитьРедактированиеСтроки(Ложь);
	ВнесеныИзменения = Ложь;
	Если Настройка.СКД Тогда
		Если Настройка.ЭтоЭлементОтбора Тогда
			Если Настройка.СтрокаНастроек.ПравоеЗначение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов) Тогда
				Настройка.СтрокаНастроек.ПравоеЗначение = Неопределено;
				ВнесеныИзменения = Истина;
			КонецЕсли;
		Иначе
			Если Настройка.СтрокаНастроек.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов) Тогда 
				Настройка.СтрокаНастроек.Значение = Неопределено;
				ВнесеныИзменения = Истина;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если Настройка.СтрокаНастроек.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов) Тогда 
			Настройка.СтрокаНастроек.Значение = Неопределено;
			ВнесеныИзменения = Истина;
		КонецЕсли;
	КонецЕсли;
	
	Если ВнесеныИзменения Тогда
		Элементы.Отчеты.ТекущиеДанные.ВнесеныИзменения = Истина;
		Модифицированность = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ОпределитьНастройку()
	
	СКД = (Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.СтраницаКомпоновщик);
	Если СКД Тогда
		Инициатор = Элементы.ПользовательскиеНастройки;
	Иначе
		Инициатор = Элементы.НастройкиТекущегоОтчета;
	КонецЕсли;
	
	// Получения описания типов, доступных для выбора.
	Если СКД Тогда
		
		// Идентификатор пользовательской настройки.
		ИдентификаторНастройки = Инициатор.ТекущаяСтрока;
		Если ИдентификаторНастройки = Неопределено Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Не выбрана настройка отчета.'"));
			Возврат Неопределено;
		КонецЕсли;
		
		ПользовательскиеНастройки = КомпоновщикНастроекКД.ПользовательскиеНастройки;
		
		// Получение строки из состава настроек компоновки данных.
		СтрокаНастроек = ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИдентификаторНастройки);
		Если СтрокаНастроек = Неопределено Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Не выбрана настройка отчета.'"));
			Возврат Неопределено;
		КонецЕсли;
		
		// Проверка типа настройки.
		Если ТипЗнч(СтрокаНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			ЭтоЭлементОтбора = Истина;
		ИначеЕсли ТипЗнч(СтрокаНастроек) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
			ЭтоЭлементОтбора = Ложь;
		Иначе
			ПоказатьПредупреждение(, НСтр("ru = 'Указывать получателя можно только для параметров и отборов отчетов.'"));
			Возврат Неопределено;
		КонецЕсли;
		
		// Поле компоновки данных.
		Если ЭтоЭлементОтбора Тогда
			НайденныеЭлементы = ПользовательскиеНастройки.ПолучитьОсновныеНастройкиПоИдентификаторуПользовательскойНастройки(
				СтрокаНастроек.ИдентификаторПользовательскойНастройки);
			
			Если НайденныеЭлементы.Количество() > 0 Тогда 
				ПолеКД = НайденныеЭлементы[0].ЛевоеЗначение;
			Иначе
				
				ПолеКД = ОпределитьПолеИзКомпоновщика(ИдентификаторНастройки, КомпоновщикНастроекКД.Настройки.Отбор.Элементы);
				Если ПолеКД = Неопределено Тогда
					ПолеКД = ОпределитьПолеИзКомпоновщика(ИдентификаторНастройки, ПользовательскиеНастройки.Элементы);
				КонецЕсли;
				Если ПолеКД = Неопределено Тогда
					ПоказатьПредупреждение(, НСтр("ru = 'Для настройки отчета не существует описания доступного поля.'"));
					Возврат Неопределено;
				КонецЕсли;
				
			КонецЕсли;
			ДоступноеПолеКД = КомпоновщикНастроекКД.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(ПолеКД);
			
		Иначе
			ДоступноеПолеКД = КомпоновщикНастроекКД.Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(СтрокаНастроек.Параметр);
		КонецЕсли;
		
		Если ДоступноеПолеКД = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		ОписаниеДоступныхТипов = ДоступноеПолеКД.ТипЗначения;
		
	Иначе
		
		// Массив типов для произвольных отчетов.
		СтрокаНастроек = Инициатор.ТекущиеДанные;
		Если СтрокаНастроек = Неопределено Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Не выбрана настройка отчета.'"));
			Возврат Неопределено;
		КонецЕсли;
		
		ОписаниеДоступныхТипов = СтрокаНастроек.Тип;
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("СКД", СКД);
	Результат.Вставить("Инициатор", Инициатор);
	Результат.Вставить("ОписаниеДоступныхТипов", ОписаниеДоступныхТипов);
	Результат.Вставить("СтрокаНастроек", СтрокаНастроек);
	Результат.Вставить("ЭтоЭлементОтбора", ЭтоЭлементОтбора);
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Функция ОпределитьПолеИзКомпоновщика(ИдентификаторНастройки, Коллекция)
	Для Каждого Элемент Из Коллекция Цикл
		Если Строка(Элемент.ИдентификаторПользовательскойНастройки) = Строка(ИдентификаторНастройки)
			И ЗначениеЗаполнено(Строка(Элемент.ЛевоеЗначение)) Тогда
			Возврат Элемент.ЛевоеЗначение;
		КонецЕсли;
		
		Если ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
			Или ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда
			Поле = ОпределитьПолеИзКомпоновщика(ИдентификаторНастройки, Элемент.Элементы);
			Если Поле <> Неопределено Тогда
				Возврат Поле;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Страница "Расписание"

&НаКлиенте
Процедура УстановитьПометки(Команда)
	ВсеМесяцы = Новый Массив;
	Для Каждого КлючИЗначение Из Кэш.Соответствия.Месяцы Цикл
		ЭтотОбъект[КлючИЗначение.Ключ] = Истина;
		ВсеМесяцы.Добавить(КлючИЗначение.Значение);
	КонецЦикла;
	Расписание.Месяцы = ВсеМесяцы;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы");
КонецПроцедуры

&НаКлиенте
Процедура СнятьПометки(Команда)
	ВсеМесяцы = Новый Массив;
	Для Каждого КлючИЗначение Из Кэш.Соответствия.Месяцы Цикл
		ЭтотОбъект[КлючИЗначение.Ключ] = Ложь;
	КонецЦикла;
	Расписание.Месяцы = ВсеМесяцы;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы");
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРасписаниеПоШаблону(Команда)
	Обработчик = Новый ОписаниеОповещения("ЗаполнитьРасписаниеПоШаблонуЗавершение", ЭтотОбъект);
	
	СписокВариантов = РассылкаОтчетовКлиент.СписокВариантовЗаполненияРасписаний();
	СписокВариантов.ПоказатьВыборЭлемента(Обработчик, НСтр("ru = 'Выберите шаблон расписания.'"));
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Доставка"

&НаКлиенте
Процедура ДобавитьИзменитьШаблонДатыРассылки(Команда)
	ДобавитьШаблон();
	
	Переменные = Новый Структура;
	Переменные.Вставить("Элемент",      ТекущийЭлемент);
	Переменные.Вставить("СтарыйТекст",  Переменные.Элемент.ВыделенныйТекст);
	Переменные.Вставить("Префикс",      "[" + ПараметрыТекстаПисьмаИФайлов.ДатаВыполнения + "(");
	Переменные.Вставить("Постфикс",     ")]");
	Переменные.Вставить("ТекстФормата", "");
	
	ДлинаПрефикса  = СтрДлина(Переменные.Префикс);
	ПозицияПрефикса  = СтрНайти(Переменные.СтарыйТекст, Переменные.Префикс);
	ПозицияПостфикса = СтрНайти(Переменные.СтарыйТекст, Переменные.Постфикс);
	
	Переменные.Вставить("СтарыйФрагментНайден", (ПозицияПрефикса > 0 И ПозицияПостфикса > ПозицияПрефикса));
	Если Переменные.СтарыйФрагментНайден Тогда
		Переменные.ТекстФормата = Сред(Переменные.СтарыйТекст, ПозицияПрефикса + ДлинаПрефикса, ПозицияПостфикса - ПозицияПрефикса - ДлинаПрефикса);
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ДобавитьИзменитьШаблонДатыРассылкиЗавершение", ЭтотОбъект, Переменные);
	
	Диалог = Новый КонструкторФорматнойСтроки;
	Диалог.ДоступныеТипы = Новый ОписаниеТипов("Дата");
	Диалог.Текст         = Переменные.ТекстФормата;
	Диалог.Показать(Обработчик);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонПолучателя(Команда)
	// Очистка окна сообщений
	ОчиститьСообщения();
	
	//
	Если НЕ Объект.Персонализирована Тогда
		СообщениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Использование получателя в тексте шаблона возможно только для вида рассылки ""%1"".'"),
			Элементы.ВидРассылки.СписокВыбора.НайтиПоЗначению("Персонализирована").Представление);
		ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеТекст, , "ВидРассылки");
		Возврат;
	КонецЕсли;
	
	ДобавитьШаблон(ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов));
	РассылкаБылаПерсонализирована = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонСформированныхОтчетов(Команда)
	ДобавитьШаблон("[" + ПараметрыТекстаПисьмаИФайлов.СформированныеОтчеты + "]", Истина);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонАвтора(Команда)
	ДобавитьШаблон("[" + ПараметрыТекстаПисьмаИФайлов.Автор + "]");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонНаименованияРассылки(Команда)
	ДобавитьШаблон("[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеРассылки + "]");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонСистемы(Команда)
	ДобавитьШаблон("[" + ПараметрыТекстаПисьмаИФайлов.ЗаголовокСистемы +  "]");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонСпособаДоставки(Команда)
	ДобавитьШаблон("[" + ПараметрыТекстаПисьмаИФайлов.СпособДоставки + "]");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонПоУмолчанию(Команда)
	ПерезаполняетсяТема = (ТекущийЭлемент = Элементы.ТемаПисьма);
	
	Если ПерезаполняетсяТема Тогда
		ЗначениеПредмета = Объект.ТемаПисьма;
		ШаблонПоУмолчанию = Кэш.Шаблоны.Тема;
	Иначе
		Если Объект.ПисьмоВФорматеHTML Тогда
			ЗначениеПредмета = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
		Иначе
			ЗначениеПредмета = Объект.ТекстПисьма;
		КонецЕсли;
		ЗначениеПредмета = СокрЛП(ЗначениеПредмета);
		ШаблонПоУмолчанию = Кэш.Шаблоны.Текст;
	КонецЕсли;
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ПерезаполняетсяТема", ПерезаполняетсяТема);
	ДополнительныеПараметры.Вставить("ШаблонПоУмолчанию", ШаблонПоУмолчанию);
	
	Если ЗначениеПредмета = "" Тогда
		// Предмет пуст - надо заполнить без вопросов.
		ДобавитьШаблонПоУмолчаниюЗавершение(1, ДополнительныеПараметры);
		
	ИначеЕсли ЗначениеПредмета = ШаблонПоУмолчанию Тогда
		// Предмет соответствует шаблону - заполнять не требуется.
		
		Если ПерезаполняетсяТема Тогда
			ТекстПредупреждения = НСтр("ru = 'Тема письма уже соответствует шаблону по умолчанию.'");
		Иначе
			ТекстПредупреждения = НСтр("ru = 'Текст письма уже соответствует шаблону по умолчанию.'");
		КонецЕсли;
		ПоказатьПредупреждение(, ТекстПредупреждения);
		
	Иначе
		// Предмет не пуст - надо запросить замену на стандартный шаблон.
		
		Если ПерезаполняетсяТема Тогда
			ЗаголовокВопроса = НСтр("ru = 'Добавить в тему письма шаблон по умолчанию'");
			ТекстВопроса = НСтр("ru = 'Заменить тему письма на шаблон по умолчанию?'");
		Иначе
			ЗаголовокВопроса = НСтр("ru = 'Добавить в текст письма шаблон по умолчанию'");
			ТекстВопроса = НСтр("ru = 'Заменить текст письма на шаблон по умолчанию?'");
		КонецЕсли;
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(1, НСтр("ru = 'Заменить'"));
		Кнопки.Добавить(2, НСтр("ru = 'Добавить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		
		Обработчик = Новый ОписаниеОповещения("ДобавитьШаблонПоУмолчаниюЗавершение", ЭтотОбъект, ДополнительныеПараметры);
		
		ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, 1, ЗаголовокВопроса);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПредпросмотрШаблона(Команда)
	ПодключитьОбработчикОжидания("ПриОткрытииПредпросмотраШаблона", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьВозможностьРассылки(Команда)
	
	ПараметрыДоставки = РассылкаОтчетовКлиентСервер.ПараметрыДоставки();
	ПараметрыДоставки.ДатаВыполнения = ОбщегоНазначенияКлиент.ДатаСеанса();
	ПараметрыДоставки.Автор = Объект.Автор;
	ПараметрыДоставки.ИспользоватьПапку = Объект.ИспользоватьПапку;
	ПараметрыДоставки.ИспользоватьСетевойКаталог = Объект.ИспользоватьСетевойКаталог;
	ПараметрыДоставки.ИспользоватьFTPРесурс = Объект.ИспользоватьFTPРесурс;
	ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = Объект.ИспользоватьЭлектроннуюПочту;
	
	ПроверитьРассылку(ПараметрыДоставки);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьТипТекстаНаHTML(Команда)
	Модифицированность = Истина;
	Объект.ПисьмоВФорматеHTML = Истина;
	ТекстПисьмаИзHTML = СокрЛП(ТекстПисьмаФорматированныйДокумент.ПолучитьТекст());
	Если ТекстПисьмаИзHTML <> Объект.ТекстПисьма Тогда
		ТекстПисьмаФорматированныйДокумент.Удалить();
		ТекстПисьмаФорматированныйДокумент.Добавить(Объект.ТекстПисьма, ТипЭлементаФорматированногоДокумента.Текст);
	КонецЕсли;
	ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПисьмоВФорматеHTML");
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьТипТекстаНаОбычный(Команда)
	Модифицированность = Истина;
	Объект.ПисьмоВФорматеHTML = Ложь;
	ТекстПисьмаИзHTML = СокрЛП(ТекстПисьмаФорматированныйДокумент.ПолучитьТекст());
	Если Объект.ТекстПисьма <> ТекстПисьмаИзHTML Тогда
		Объект.ТекстПисьма = ТекстПисьмаИзHTML;
	КонецЕсли;
	ТекущийЭлемент = Элементы.ТекстПисьма;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПисьмоВФорматеHTML");
КонецПроцедуры

&НаКлиенте
Процедура ВажностьВысокая(Команда)
	Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.ВысокаяВажностьИнтернетПочтовогоСообщения();
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьВысокая;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Высокая важность'");
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ВажностьОбычная(Команда)
	Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.ОбычнаяВажностьИнтернетПочтовогоСообщения();
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Обычная важность'");
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ВажностьНизкая(Команда)
	Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.НизкаяВажностьИнтернетПочтовогоСообщения();
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНизкая;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Низкая важность'");
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДобавитьДополнительныйПараметрТекстаПисьма(Команда)

	Если ДополнительныеПараметрыТекстаПисьма = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Не ДополнительныеПараметрыТекстаПисьма.Свойство(Команда.Имя) Тогда
		Возврат;
	КонецЕсли;

	ИмяПараметра = "[" + ДополнительныеПараметрыТекстаПисьма[Команда.Имя].Имя + "]";
	ДобавитьШаблон(ИмяПараметра);

КонецПроцедуры

&НаКлиенте
Процедура ВставлятьОтчетыВТекстПисьмаПриИзменении(Элемент)

	Если Объект.ВставлятьОтчетыВТекстПисьма Тогда
		Объект.ТолькоУведомить = Ложь;
		Если Объект.ПрикреплятьОтчетыВоВложения Тогда
			ПроверкаШифрованияПередВключениемОтчетовВТелеПисьма();
		КонецЕсли;
	Иначе
		Объект.ПрикреплятьОтчетыВоВложения = Истина;
		ВидимостьДоступностьКорректность(ЭтотОбъект, "ПрикреплятьОтчетыВоВложения");
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПрикреплятьОтчетыВоВложенияПриИзменении(Элемент)

	Если Объект.ПрикреплятьОтчетыВоВложения Тогда
		Объект.ТолькоУведомить = Ложь;
		Если Объект.ПрикреплятьОтчетыВоВложения Тогда
			ПроверкаШифрованияПередВключениемОтчетовВТелеПисьма();
		КонецЕсли;
	Иначе
		Объект.ВставлятьОтчетыВТекстПисьма = Истина;
	КонецЕсли;

	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПрикреплятьОтчетыВоВложения");
	

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница "Дополнительно"

&НаКлиенте
Процедура СброситьФорматПоУмолчанию(Команда)
	ОчиститьФормат(Кэш.ПустоеЗначениеОтчета);
	ФорматыПоУмолчанию = СписокФорматовПоУмолчаниюПредставление;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ФорматыПоУмолчанию");
КонецПроцедуры

&НаКлиенте
Процедура СнятьПометкиОтправлятьЕслиПустой(Команда)
	Если Объект.Отчеты.Количество() > 0 Тогда
		Модифицированность = Истина;
		Для Каждого СтрОтчет Из Объект.Отчеты Цикл
			СтрОтчет.ОтправлятьЕслиПустой = Ложь;
			СтрОтчет.НеОтправлятьПустой = Истина;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкиОтправлятьЕслиПустой(Команда)
	Если Объект.Отчеты.Количество() > 0 Тогда
		Модифицированность = Истина;
		Для Каждого СтрОтчет Из Объект.Отчеты Цикл
			СтрОтчет.ОтправлятьЕслиПустой = Истина;
			СтрОтчет.НеОтправлятьПустой = Ложь;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СоздатьПарольАрхива(Команда)
	
	Если ЗначениеЗаполнено(ПарольАрхива) Тогда	
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ПриСозданииПароляАрхива", ЭтотОбъект),
			НСтр("ru = 'Пароль для архива уже установлен. Установить новый пароль?'"),
			РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);	
		Возврат;
	КонецЕсли;
	
	Если Объект.ВставлятьОтчетыВТекстПисьма И Объект.ПрикреплятьОтчетыВоВложения Тогда
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;

		КнопкиВопроса = Новый СписокЗначений;
		КнопкиВопроса.Добавить("УстановитьПарольАвтоматически", НСтр("ru = 'Установить пароль'"));
		КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
		ТекстВопроса = НСтр(
			"ru = 'Для того чтобы установить пароль, необходимо убрать отчеты из текста письма.'");
		ПараметрыВопроса.КнопкаПоУмолчанию = "УстановитьПароль";

		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросПарольШифрованиеОтчетыВТекстеПисьма", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);
	Иначе
		ПарольАрхива = СоздатьПароль();
		ПарольАрхиваИзменен = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПаролиШифрование(Команда)

	ОткрытьФормуПаролиШифрование();

КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименование(Команда)
	УстановитьШаблоныНаименований("НаименованиеОтчета", Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименованиеФормат(Команда)
	УстановитьШаблоныНаименований("НаименованиеОтчетаФормат", Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименованиеПериод(Команда)
	УстановитьШаблоныНаименований("НаименованиеПериод", Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименованиеПериодФормат(Команда)
	УстановитьШаблоныНаименований("НаименованиеПериодФормат", Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименованиеДатаРассылки(Команда)
	УстановитьШаблоныНаименований("НаименованиеДатаРассылки", Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблонНаименованиеДатаРассылкиФормат(Команда)
	УстановитьШаблоныНаименований("НаименованиеДатаРассылкиФормат", Истина);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Клиент.

&НаКлиенте
Процедура НачалоВыбораПользовательскойНастройки(СтандартнаяОбработка)
	Если Элементы.СтраницыНастроекОтчета.ТекущаяСтраница <> Элементы.СтраницаКомпоновщик Тогда
		Возврат;
	КонецЕсли;
	Отчет = Элементы.Отчеты.ТекущиеДанные;
	Если Отчет = Неопределено Или ТипЗнч(Отчет.Отчет) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда
		Возврат;
	КонецЕсли;
	ИдентификаторКД = Элементы.ПользовательскиеНастройки.ТекущаяСтрока;
	Обработчик = Новый ОписаниеОповещения("ЗавершениеВыбораПользовательскойНастройки", ЭтотОбъект);
	РассылкаОтчетовКлиентПереопределяемый.ПриНачалеВыбораНастройки(Отчет, КомпоновщикНастроекКД, ИдентификаторКД, СтандартнаяОбработка, Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеВыбораПользовательскойНастройки(Результат, ПараметрыВыполнения) Экспорт
	Если ТипЗнч(Результат) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
		КомпоновщикНастроекКД.ЗагрузитьПользовательскиеНастройки(Результат);
	Иначе
		Возврат;
	КонецЕсли;
	Отчет = Элементы.Отчеты.ТекущиеДанные;
	Если Отчет = Неопределено Или ТипЗнч(Отчет.Отчет) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда
		Возврат;
	КонецЕсли;
	Отчет.ВнесеныИзменения = Истина;
КонецПроцедуры

// Обработчик закрытия формы ПолучателиРассылки.
//
// Параметры:
//   Результат - Структура:
//     * Получатели - ТаблицаЗначений:
//         * Получатель - СправочникСсылка.ГруппыПользователей,
//                      - СправочникСсылка._ДемоКонтрагенты,
//                      - СправочникСсылка._ДемоПартнеры,
//                      - СправочникСсылка.Пользователи
//         * Исключен - Булево
//         * Адрес - Строка
//         * ИндексКартинки - Число
//     * ВидПочтовогоАдресаПолучателей - СправочникСсылка.ВидыКонтактнойИнформации
//   Параметр - Структура
//            - Неопределено
//
&НаКлиенте
Процедура ПолучателиРассылкиНажатиеЗавершение(Результат, Параметр) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Объект.ВидПочтовогоАдресаПолучателей = Результат.ВидПочтовогоАдресаПолучателей;
	Объект.Получатели.Очистить();
	Для Каждого Элемент Из Результат.Получатели Цикл 
		НоваяСтрока = Объект.Получатели.Добавить();
		НоваяСтрока.Получатель = Элемент.Получатель;
		НоваяСтрока.Исключен = Элемент.Исключен;
	КонецЦикла;
	
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ПолучателиРассылки");
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТипПолучателейРассылкиОбработкаВыбораЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Объект.Получатели.Очистить();
		ТипПолучателейРассылки = ДополнительныеПараметры.ВыбранноеЗначение;
		Модифицированность = Истина;
		ТипПолучателейРассылкиПриИзменении(Неопределено);
		ВидимостьДоступностьКорректность(ЭтотОбъект, "ПолучателиРассылки");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблонПоУмолчаниюЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	ШаблонПоУмолчанию = ДополнительныеПараметры.ШаблонПоУмолчанию;
	Если Ответ = 1 Тогда
		Если ДополнительныеПараметры.ПерезаполняетсяТема Тогда
			Объект.ТемаПисьма = ШаблонПоУмолчанию;
		Иначе
			Если Объект.ПисьмоВФорматеHTML Тогда
				ТекстПисьмаФорматированныйДокумент.Удалить();
				ТекстПисьмаФорматированныйДокумент.Добавить(ШаблонПоУмолчанию, ТипЭлементаФорматированногоДокумента.Текст);
			Иначе
				Объект.ТекстПисьма = ШаблонПоУмолчанию;
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли Ответ = 2 Тогда
		ДобавитьШаблон(ШаблонПоУмолчанию);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьРассылкуПослеОтветаНаВопрос(Ответ, ПараметрыДоставки) Экспорт
	Если Ответ = 1 Или Модифицированность Тогда
		Если Ответ = 1 Тогда
			Объект.Подготовлена = Истина;
		КонецЕсли;
		ПараметрыЗаписи = Новый Структура;
		ПараметрыЗаписи.Вставить("ИмяКоманды", "КомандаПроверитьРассылку");
		ПараметрыЗаписи.Вставить("ПараметрыДоставки", ПараметрыДоставки);
		ЗаписатьНаКлиенте(Неопределено, ПараметрыЗаписи);
		Возврат;
	ИначеЕсли Ответ <> -1 Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьСообщения();
	
	ПараметрыДоставки.Рассылка = Объект.Наименование;
	
	Если ПараметрыДоставки.ИспользоватьПапку Тогда
		ПараметрыДоставки.Папка = Объект.Папка;
	КонецЕсли;
	
	Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда
		ПараметрыДоставки.СетевойКаталогWindows = Объект.СетевойКаталогWindows;
		ПараметрыДоставки.СетевойКаталогLinux = Объект.СетевойКаталогLinux;
	КонецЕсли;
	
	Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда
		ПараметрыДоставки.Владелец = Объект.Ссылка;
		ПараметрыДоставки.Сервер = Объект.FTPСервер;
		ПараметрыДоставки.Порт = Объект.FTPПорт;
		ПараметрыДоставки.Логин = Объект.FTPЛогин;
		Если FTPПарольИзменен Тогда
			ПараметрыДоставки.Пароль = FTPПароль;
		КонецЕсли;
		ПараметрыДоставки.Каталог = Объект.FTPКаталог;
		ПараметрыДоставки.ПассивноеСоединение = Объект.FTPПассивноеСоединение;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ПроверитьРассылкуПослеВыбораПолучателей", ЭтотОбъект, ПараметрыДоставки);
	
	Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда
		РассылкаОтчетовКлиент.ВыбратьПолучателя(Обработчик, Объект, Ложь, Истина);
		Возврат;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Обработчик, Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьРассылкуПослеВыбораПолучателей(РезультатВыбора, ПараметрыДоставки) Экспорт
	// Обработчик результата работы процедуры ПроверитьРассылкуПослеОтветаНаВопрос.
	Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда
		Если РезультатВыбора = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		ПараметрыДоставки.УчетнаяЗапись = Объект.УчетнаяЗапись;
		ПараметрыДоставки.СкрытыеКопии  = Объект.СкрытыеКопии;
		ПараметрыДоставки.ШаблонТемы    = НСтр("ru = 'Тестовое сообщение 1С:Предприятие'");
		ПараметрыДоставки.ШаблонТекста  = НСтр("ru = 'Это сообщение отправлено системой рассылок 1С:Предприятие.'")
			+ Символы.ПС + Кэш.ЗаголовокСистемы;
		ПараметрыДоставки.Получатели    = РезультатВыбора;
	КонецЕсли;
	
	РезультатВыполнения = ПроверитьСпособДоставки(Объект.Ссылка, ПараметрыДоставки);
	
	ПараметрыПредупреждения = Новый Структура("Заголовок, Текст, Подробно, Ссылка, ИспользоватьЭлектроннуюПочту");
	ЗаполнитьЗначенияСвойств(ПараметрыПредупреждения, ПараметрыДоставки);
	ЗаполнитьЗначенияСвойств(ПараметрыПредупреждения, РезультатВыполнения);
	ПараметрыПредупреждения.Заголовок = НСтр("ru = 'Результат проверки'");
	ПараметрыПредупреждения.Ссылка = Объект.УчетнаяЗапись;
	
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.Предупреждение", ПараметрыПредупреждения, ЭтотОбъект, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРасписаниеПоШаблонуЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
	Если ВыбранныйЭлемент <> Неопределено Тогда
		ЗаполнитьРасписаниеПоВарианту(ВыбранныйЭлемент.Значение, Истина);
	КонецЕсли;
КонецПроцедуры

// Обработчик закрытия диалога форматной строки.
//
// Параметры:
//   СтрокаРезультат - Строка
//   Переменные - Структура
//
&НаКлиенте
Процедура ДобавитьИзменитьШаблонДатыРассылкиЗавершение(СтрокаРезультат, Переменные) Экспорт
	Если СтрокаРезультат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НовыйФрагмент   = Переменные.Префикс + СтрокаРезультат + Переменные.Постфикс;
	СтарыйФрагмент  = Переменные.Префикс + Переменные.ТекстФормата + Переменные.Постфикс;
	
	Если Переменные.Свойство("ИзменятьШаблонНаименованияОтчетаМножественно")
	   И Переменные.ИзменятьШаблонНаименованияОтчетаМножественно Тогда
		Если Переменные.СтарыйФрагментНайден Тогда
			ШаблонНаименования = СтрЗаменить(Переменные.СтарыйТекст, СтарыйФрагмент, НовыйФрагмент);
		Иначе
			ШаблонНаименования = Переменные.СтарыйТекст + НовыйФрагмент;
		КонецЕсли;
		УстановитьШаблоныНаименованийДляВсехОтчетов(Переменные.ИмяШаблона, ШаблонНаименования);
	ИначеЕсли Переменные.Свойство("ИзменятьШаблонНаименованияОтчета") И Переменные.ИзменятьШаблонНаименованияОтчета Тогда
		Если Переменные.СтарыйФрагментНайден Тогда
			Если СтрокаРезультат = Переменные.ТекстФормата Тогда
				Возврат;
			КонецЕсли;
			Элементы.ФорматыОтчетов.ТекущиеДанные.ШаблонНаименования = СтрЗаменить(Переменные.СтарыйТекст, СтарыйФрагмент, НовыйФрагмент);
		Иначе
			Элементы.ФорматыОтчетов.ТекущиеДанные.ШаблонНаименования = Переменные.СтарыйТекст + НовыйФрагмент;
		КонецЕсли;
	ИначеЕсли Переменные.Элемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда
		ЗаменаВыполнена = Ложь;
		Если Переменные.СтарыйФрагментНайден Тогда
			РезультатПоиска = ТекстПисьмаФорматированныйДокумент.НайтиТекст(СтарыйФрагмент);
			Если РезультатПоиска <> Неопределено Тогда
				Найденные = ТекстПисьмаФорматированныйДокумент.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);
				Для Каждого ТекстФД Из Найденные Цикл
					Если СтрНайти(ТекстФД.Текст, СтарыйФрагмент) > 0 Тогда
						ТекстФД.Текст = СтрЗаменить(ТекстФД.Текст, СтарыйФрагмент, НовыйФрагмент);
						ЗаменаВыполнена = Истина;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли; // Переменные.СтарыйФрагментНайден
		Если Не ЗаменаВыполнена Тогда
			Если СокрЛП(Переменные.СтарыйТекст) = СтарыйФрагмент Тогда
				// Для форматированного документа свойство ВыделенныйТекст используется в тех редких случаях,
				//  когда это безопасно для редактируемого текста.
				Переменные.Элемент.ВыделенныйТекст = НовыйФрагмент;
			Иначе
				ТекстПисьмаФорматированныйДокумент.Добавить(НовыйФрагмент, ТипЭлементаФорматированногоДокумента.Текст);
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если Переменные.СтарыйФрагментНайден Тогда
			Если СтрокаРезультат = Переменные.ТекстФормата Тогда
				Возврат;
			КонецЕсли;
			Переменные.Элемент.ВыделенныйТекст = СтрЗаменить(Переменные.СтарыйТекст, СтарыйФрагмент, НовыйФрагмент);
		Иначе
			Переменные.Элемент.ВыделенныйТекст = Переменные.СтарыйТекст + НовыйФрагмент;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФорматЗавершение(СписокФорматов, Переменные) Экспорт
	Если СписокФорматов = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Проверка изменений
	ФорматыСовпадают = Истина;
	Для Индекс = 1 По СписокФорматов.Количество() Цикл
		Если СписокФорматов[Индекс - 1].Пометка <> Переменные.СписокФорматовКопия[Индекс - 1].Пометка Тогда
			ФорматыСовпадают = Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если ФорматыСовпадают Тогда
		Возврат;
	КонецЕсли;
	
	ПредставлениеФормата = "";
	
	// Очистка существующих записей.
	ОчиститьФормат(Переменные.СсылкаНаОтчет);
	
	// Добавление отмеченных форматов.
	Для Каждого ЭлементСписка Из СписокФорматов Цикл
		Если ЭлементСписка.Пометка Тогда
			СтрокаФормат = Объект.ФорматыОтчетов.Добавить();
			СтрокаФормат.Отчет  = Переменные.СсылкаНаОтчет;
			СтрокаФормат.Формат = ЭлементСписка.Значение;
			ПредставлениеФормата = ПредставлениеФормата + ?(ПредставлениеФормата = "", "", ", ") + Строка(ЭлементСписка.Представление);
		КонецЕсли;
	КонецЦикла;
	
	Если Переменные.ЭтоФорматПоУмолчанию И ПредставлениеФормата = "" Тогда
		ПредставлениеФормата = СписокФорматовПоУмолчаниюПредставление;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Переменные.ОбработчикРезультата, ПредставлениеФормата);
КонецПроцедуры

&НаКлиенте
Процедура ФорматыОтчетовФорматыЗавершениеВыбора(ПредставлениеФормата, Переменные) Экспорт
	Если ПредставлениеФормата <> Неопределено Тогда
		Переменные.СтрокаОтчеты.Форматы = ПредставлениеФормата;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ФорматыПоУмолчаниюЗавершениеВыбора(ПредставлениеФормата, Переменные) Экспорт
	Если ПредставлениеФормата <> Неопределено Тогда
		ФорматыПоУмолчанию = ПредставлениеФормата;
	КонецЕсли;
	ВидимостьДоступностьКорректность(ЭтотОбъект, "ФорматыПоУмолчанию");
КонецПроцедуры

&НаКлиенте
Процедура ПослеИзмененияРасписания(РасписаниеРезультат, ДополнительныеПараметры) Экспорт
	Если РасписаниеРезультат <> Неопределено Тогда
		Модифицированность = Истина;
		Расписание = РасписаниеРезультат;
		ВидимостьДоступностьКорректность(ЭтотОбъект, "Расписание");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Уникальность = Истина)
	
	// (СправочникСсылка.*) перетаскивание из формы выбора или подбора.
	ЗначениеРеквизита = ЭлементПодбора;
	
	// Требуется уникальность реквизита в рамках таблицы.
	Найденные = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяРеквизита, ЗначениеРеквизита));
	
	Если Уникальность И Найденные.Количество() > 0 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	СтрокаТаблицы = ТабличнаяЧасть.Добавить();
	СтрокаТаблицы[ИмяРеквизита] = ЗначениеРеквизита;
	ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтруктураЗаполнения);
	
	Возврат СтрокаТаблицы;
КонецФункции

&НаКлиенте
Функция ВыборПодборПеретаскиваниеВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Идентификаторы = Ложь)
	Модифицированность = Истина;
	МассивНовыхСтрок = Новый Массив;
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
		Для Каждого ЭлементПодбора Из ВыбранноеЗначение Цикл
			Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения);
			Если Результат <> Неопределено Тогда
				МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат));
			КонецЕсли;
		КонецЦикла;
	Иначе
		Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения);
		Если Результат <> Неопределено Тогда
			МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат));
		КонецЕсли;
	КонецЕсли;
	Возврат МассивНовыхСтрок;
КонецФункции

&НаКлиенте
Процедура ВыбратьФормат(СсылкаНаОтчет, ОбработчикРезультата)
	// Для хранения всех форматов, выбранных пользователем, используется табличная часть ФорматыОтчетов.
	// При этом, для форматов "по умолчанию" используется пустое значение реквизита Отчет.
	// В зависимости от типа внедрения реквизит Отчет может принимать значение Неопределено или ПустаяСсылка.
	ЭтоФорматПоУмолчанию = Не ЗначениеЗаполнено(СсылкаНаОтчет);
	
	Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет));
	Если Найденные.Количество() > 0 Тогда
		СписокФорматов.ЗаполнитьПометки(Ложь);
		Для Каждого СтрокаФормат Из Найденные Цикл
			СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина;
		КонецЦикла;
	Иначе
		СписокФорматов = СписокФорматовПоУмолчанию.Скопировать();
		Если Не ЭтоФорматПоУмолчанию Тогда
			Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", Кэш.ПустоеЗначениеОтчета));
			Если Найденные.Количество() > 0 Тогда
				СписокФорматов.ЗаполнитьПометки(Ложь);
				Для Каждого СтрокаФормат Из Найденные Цикл
					СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ЭтоФорматПоУмолчанию Тогда
		ЗаголовокДиалога = НСтр("ru = 'Выберите форматы по умолчанию'");
	Иначе
		ЗаголовокДиалога = НСтр("ru = 'Выберите форматы для отчета ""%1""'");
		ЗаголовокДиалога = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокДиалога, Строка(СсылкаНаОтчет));
	КонецЕсли;
	
	Переменные = Новый Структура;
	Переменные.Вставить("СсылкаНаОтчет",        СсылкаНаОтчет);
	Переменные.Вставить("СписокФорматовКопия",  СписокФорматов.Скопировать());
	Переменные.Вставить("ЭтоФорматПоУмолчанию", ЭтоФорматПоУмолчанию);
	Переменные.Вставить("ОбработчикРезультата", ОбработчикРезультата);
	Обработчик = Новый ОписаниеОповещения("ВыбратьФорматЗавершение", ЭтотОбъект, Переменные);
	
	СписокФорматов.ПоказатьОтметкуЭлементов(Обработчик, ЗаголовокДиалога);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьФормат(СсылкаНаОтчет)
	Модифицированность = Истина;
	Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет));
	Для Каждого СтрокаФормат Из Найденные Цикл
		Объект.ФорматыОтчетов.Удалить(СтрокаФормат);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьШаблон(ТекстовыйШаблон = Неопределено, ИсключитьТемуПисьма = Ложь)
	// Проверяем и устанавливаем фокус в нужный элемент.
	Если ИсключитьТемуПисьма Или Не (ТекущийЭлемент = Элементы.ТемаПисьма Или ТекущийЭлемент = Элементы.ИмяАрхива) Тогда
		Если Объект.ПисьмоВФорматеHTML Тогда
			Если ТекущийЭлемент <> Элементы.ТекстПисьмаФорматированныйДокумент Тогда
				ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент;
			КонецЕсли;
		Иначе
			Если ТекущийЭлемент <> Элементы.ТекстПисьма Тогда
				ТекущийЭлемент = Элементы.ТекстПисьма;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ТекстовыйШаблон = Неопределено Тогда
		// Ограничимся подготовкой к добавлению шаблона (переключением текущего элемента).
		Возврат;
	КонецЕсли;
	
	Если ТекущийЭлемент.ВыделенныйТекст = "" Тогда
		// Форматированный документ некорректно отрабатывает изменения свойства.
		//  ВыделенныйТекст, в случае, если ничего не выделено,
		//  поэтому используется альтернативный метод добавления текста.
		Если ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда
			ТекстПисьмаФорматированныйДокумент.Добавить(ТекстовыйШаблон, ТипЭлементаФорматированногоДокумента.Текст);
		Иначе
			ТекущийЭлемент.ВыделенныйТекст = ТекстовыйШаблон;
		КонецЕсли;
	Иначе
		ТекущийЭлемент.ВыделенныйТекст = ТекущийЭлемент.ВыделенныйТекст + ТекстовыйШаблон;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ИзменитьСоставМассива(Добавить, Элемент, Знач Массив)
	Индекс = Массив.Найти(Элемент);
	Если Добавить И Индекс = Неопределено Тогда
		ВГраницаПлюс1 = ?(Массив.Количество() >= Элемент, Элемент, Массив.Количество());
		Для Индекс = 1 По ВГраницаПлюс1 Цикл
			Если Массив[ВГраницаПлюс1 - Индекс] < Элемент Тогда
				Массив.Вставить(ВГраницаПлюс1 - Индекс + 1, Элемент);
				Возврат Массив;
			КонецЕсли;
		КонецЦикла;
		Массив.Вставить(0, Элемент);
	ИначеЕсли Не Добавить И Индекс <> Неопределено Тогда
		Массив.Удалить(Индекс);
	КонецЕсли;
	Возврат Массив;
КонецФункции

&НаКлиенте
Процедура ИзменитьРасписаниеВДиалоге()
	Обработчик = Новый ОписаниеОповещения("ПослеИзмененияРасписания", ЭтотОбъект);
	ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание);
	ДиалогРасписания.Показать(Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ВычислитьФлажкиДополнительныхСпособовДоставки()
	Объект.ИспользоватьПапку        = Публиковать И (ДругойСпособДоставки = "ИспользоватьПапку");
	Объект.ИспользоватьСетевойКаталог = Публиковать И (ДругойСпособДоставки = "ИспользоватьСетевойКаталог");
	Объект.ИспользоватьFTPРесурс    = Публиковать И (ДругойСпособДоставки = "ИспользоватьFTPРесурс");
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьРассылку(ПараметрыДоставки)
	// Очистка окна сообщений.
	ОчиститьСообщения();
	
	// Проверка подготовленности данных и необходимости записи.
	Если Не Объект.Подготовлена Или Объект.Ссылка.Пустая() Тогда
		ЗаголовокВопроса = НСтр("ru = 'Проверка способа доставки'");
		Если Не Объект.Подготовлена Тогда
			ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть подготовлена.
			|Нажмите ""Продолжить"", чтобы включить флажок ""Подготовлена"" и записать рассылку.'");
		Иначе
			ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть записана.
			|Нажмите ""Продолжить"", чтобы записать рассылку.'");
		КонецЕсли;
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(1, НСтр("ru = 'Продолжить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		
		Обработчик = Новый ОписаниеОповещения("ПроверитьРассылкуПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыДоставки);
		ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, 1, ЗаголовокВопроса);
	Иначе
		ПроверитьРассылкуПослеОтветаНаВопрос(-1, ПараметрыДоставки);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриСозданииПароляАрхива(Ответ, Контекст) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПарольАрхива = СоздатьПароль();
		ПарольАрхиваИзменен = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьШаблоныНаименований(ИмяШаблона, МножественноеИзменение = Ложь)

	Если МножественноеИзменение Тогда
		УстановитьШаблоныНаименованийДляВсехОтчетов(ИмяШаблона);
	Иначе
		Шаблоны = ШаблоныНаименований();
		Элементы.ФорматыОтчетов.ТекущиеДанные.ШаблонНаименования = Шаблоны.Получить(ИмяШаблона);
	КонецЕсли;
	
	Модифицированность = Истина;

	Если ИмяШаблона = "НаименованиеОтчета" Или ИмяШаблона = "НаименованиеОтчетаФормат" Тогда
		Возврат;
	КонецЕсли;

	Переменные = ПеременныеВыбораШаблонаНаименованияОтчета(ИмяШаблона, МножественноеИзменение);
	Обработчик = Новый ОписаниеОповещения("ДобавитьИзменитьШаблонДатыРассылкиЗавершение", ЭтотОбъект, Переменные);

	Диалог = Новый КонструкторФорматнойСтроки;
	Диалог.ДоступныеТипы = Новый ОписаниеТипов("Дата");
	Диалог.Текст         = Переменные.ТекстФормата;
	Диалог.Показать(Обработчик);

КонецПроцедуры

&НаКлиенте
Функция ПеременныеВыбораШаблонаНаименованияОтчета(ИмяШаблона, МножественноеИзменение)

	Переменные = Новый Структура;
	Переменные.Вставить("Элемент", Неопределено);
	Переменные.Вставить("СтарыйТекст", "");
	Переменные.Вставить("Постфикс", ")]");
	Переменные.Вставить("ТекстФормата", "");
	Переменные.Вставить("СтарыйФрагментНайден", Ложь);
	Переменные.Вставить("ИзменятьШаблонНаименованияОтчета", Истина);
	Переменные.Вставить("ИзменятьШаблонНаименованияОтчетаМножественно", МножественноеИзменение);
	Переменные.Вставить("ИмяШаблона", ИмяШаблона);

	Если ИмяШаблона = "НаименованиеДатаРассылки" Тогда

		Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаРассылки + "("));

	ИначеЕсли ИмяШаблона = "НаименованиеДатаРассылкиФормат" Тогда

		Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаРассылки + "("));

		Переменные.Вставить("Постфикс", ")] [" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]");

	ИначеЕсли ИмяШаблона = "НаименованиеПериод" Тогда

		Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 за %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.Период + "("));

	ИначеЕсли ИмяШаблона = "НаименованиеПериодФормат" Тогда

		Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 за %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.Период + "("));
			
		Переменные.Вставить("Постфикс", ")] [" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]");
	КонецЕсли;

	Возврат Переменные;

КонецФункции

&НаКлиенте
Процедура ПроверкаШифрованияПередВключениемОтчетовВТелеПисьма()

	ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
	ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;

	Если Объект.Персонализирована И Объект.УстановитьПаролиЗашифровать Тогда

		Если ДоступноШифрованиеВложений Тогда
			Если Объект.Архивировать Тогда
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("ОтключитьПаролиШифрование", НСтр("ru = 'Вставлять отчеты в текст письма'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы вставлять отчеты в текст письма, нужно отключить пароли и шифрование.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "ОтключитьПаролиШифрование";
			Иначе
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("ОтключитьПаролиШифрование", НСтр("ru = 'Вставлять отчеты в текст письма'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы вставлять отчеты в текст письма, нужно отключить шифрование.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "ОтключитьШифрование";
			КонецЕсли;
		ИначеЕсли Объект.Архивировать Тогда
			КнопкиВопроса = Новый СписокЗначений;
			КнопкиВопроса.Добавить("ОтключитьПаролиШифрование", НСтр("ru = 'Вставлять отчеты в текст письма'"));
			КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
			ТекстВопроса = НСтр("ru = 'Для того чтобы вставлять отчеты в текст письма, нужно отключить пароли.'");
			ПараметрыВопроса.КнопкаПоУмолчанию = "ОтключитьПароли";
		КонецЕсли;
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);

	ИначеЕсли Объект.Личная Тогда

		Если ДоступноШифрованиеВложений Тогда

			Если Объект.Архивировать И ЗначениеЗаполнено(ПарольАрхива) И ЗначениеЗаполнено(ЭтотОбъект["СертификатДляШифрования"]) Тогда
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("ОтключитьПарольШифрование", НСтр("ru = 'Вставлять отчеты в текст письма'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы вставлять отчеты в текст письма, нужно отключить пароль и шифрование.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "ОтключитьПарольШифрование";

				СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
					Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект),
					ТекстВопроса, КнопкиВопроса, ПараметрыВопроса);

			ИначеЕсли Объект.Архивировать И ЗначениеЗаполнено(ПарольАрхива) Тогда
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("ОчиститьПароль", НСтр("ru = 'Вставлять отчеты в текст письма'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр(
					"ru = 'Для того чтобы вставлять отчеты в текст письма, нужно очистить пароль архива.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "ОчиститьПароль";

				СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
					Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект),
					ТекстВопроса, КнопкиВопроса, ПараметрыВопроса);

			ИначеЕсли ЗначениеЗаполнено(ЭтотОбъект["СертификатДляШифрования"]) Тогда
				КнопкиВопроса = Новый СписокЗначений;
				КнопкиВопроса.Добавить("ОчиститьСертификат", НСтр("ru = 'Вставлять отчеты в текст письма'"));
				КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
				ТекстВопроса = НСтр("ru = 'Для того чтобы вставлять отчеты в текст письма, нужно очистить поле сертификата для шифрования.'");
				ПараметрыВопроса.КнопкаПоУмолчанию = "ОчиститьСертификат";

				СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
					Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект),
					ТекстВопроса, КнопкиВопроса, ПараметрыВопроса);
			КонецЕсли;
		ИначеЕсли Объект.Архивировать И ЗначениеЗаполнено(ПарольАрхива) Тогда
			КнопкиВопроса = Новый СписокЗначений;
			КнопкиВопроса.Добавить("ОчиститьПароль", НСтр("ru = 'Вставлять отчеты в текст письма'"));
			КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
			ТекстВопроса = НСтр(
				"ru = 'Для того чтобы вставлять отчеты в текст письма, нужно очистить пароль архива.'");
			ПараметрыВопроса.КнопкаПоУмолчанию = "ОчиститьПароль";

			СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
				Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект), ТекстВопроса,
				КнопкиВопроса, ПараметрыВопроса);
		КонецЕсли;

	ИначеЕсли Не Объект.Персонализирована И Не Объект.Личная И Объект.Архивировать И ЗначениеЗаполнено(ПарольАрхива) Тогда
		КнопкиВопроса = Новый СписокЗначений;
		КнопкиВопроса.Добавить("ОчиститьПароль", НСтр("ru = 'Вставлять отчеты в текст письма'"));
		КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
		ТекстВопроса = НСтр(
			"ru = 'Для того чтобы вставлять отчеты в текст письма, нужно очистить пароль архива.'");
		ПараметрыВопроса.КнопкаПоУмолчанию = "ОчиститьПароль";

		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОтчетыВТекстеПисьмаШифрование(Результат, Параметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Результат.Значение = "ОтключитьПаролиШифрование" Тогда
		Объект.УстановитьПаролиЗашифровать = Ложь;
		Элементы.ПаролиШифрование.Доступность = Ложь;
	ИначеЕсли Результат.Значение = "ОтключитьПарольШифрование" Тогда
		ПарольАрхива = "";
		ЭтотОбъект["СертификатДляШифрования"] = "";
		ПарольАрхиваИзменен = Истина;
		СертификатДляШифрованияИзменен = Истина;
	ИначеЕсли Результат.Значение = "ОчиститьПароль" Тогда
		ПарольАрхива = "";
		ПарольАрхиваИзменен = Истина;
	ИначеЕсли Результат.Значение = "ОчиститьСертификат" Тогда
		ЭтотОбъект["СертификатДляШифрования"] = "";
		СертификатДляШифрованияИзменен = Истина;
	ИначеЕсли Результат.Значение = КодВозвратаДиалога.Отмена Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПроверкаПриУстановкеПароляАрхиваВставлятьОтчетыВТекстПисьма()

	Если ЗначениеЗаполнено(ПарольАрхива) И Объект.Архивировать И Объект.ВставлятьОтчетыВТекстПисьма 
		И Объект.ПрикреплятьОтчетыВоВложения Тогда
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		
		КнопкиВопроса = Новый СписокЗначений;
		КнопкиВопроса.Добавить("УстановитьПароль", НСтр("ru = 'Установить пароль'"));
		КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
		ТекстВопроса = НСтр(
			"ru = 'Для того чтобы установить пароль, необходимо убрать отчеты из текста письма.'");
		ПараметрыВопроса.КнопкаПоУмолчанию = "УстановитьПароль";

		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросПарольШифрованиеОтчетыВТекстеПисьма", ЭтотОбъект), ТекстВопроса,
			КнопкиВопроса, ПараметрыВопроса);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросПарольШифрованиеОтчетыВТекстеПисьма(Результат, Параметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Результат.Значение = "УстановитьПароль" Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
	ИначеЕсли Результат.Значение = "УстановитьПарольАвтоматически" Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
		ПарольАрхива = СоздатьПароль();
		ПарольАрхиваИзменен = Истина;
	ИначеЕсли Результат.Значение = "УстановитьСертификатДляШифрования" Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
	ИначеЕсли Результат.Значение = КодВозвратаДиалога.Отмена Тогда
		ПарольАрхива = "";
		ПарольАрхиваИзменен = Истина;
		ЭтотОбъект["СертификатДляШифрования"] = "";
		СертификатДляШифрованияИзменен = Истина;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросУстановитьПаролиОтчетыВТекстеПисьма(Результат, Параметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Результат.Значение = "УстановитьПаролиЗашифровать" Тогда
		Объект.ВставлятьОтчетыВТекстПисьма = Ложь;
		ОткрытьФормуПаролиШифрование();
	ИначеЕсли Результат.Значение = КодВозвратаДиалога.Отмена Тогда
		Объект.УстановитьПаролиЗашифровать = Ложь;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуПаролиШифрование()

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресПолучателей", ПоместитьПолучателейВХранилище());
	ПараметрыФормы.Вставить("Архивировать", Объект.Архивировать);
	ПараметрыФормы.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки);
	ПараметрыФормы.Вставить("ВидПочтовогоАдресаПолучателей", Объект.ВидПочтовогоАдресаПолучателей);
	ПараметрыФормы.Вставить("Ссылка", Объект.Ссылка);
	ПараметрыФормы.Вставить("НаименованиеРассылки", Объект.Наименование);
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПаролиШифрование", ПараметрыФормы, ЭтотОбъект, , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры


&НаКлиенте
Процедура УстановитьШаблоныНаименованийДляВсехОтчетов(ИмяШаблона, ШаблонНаименования = "")
	
	Шаблоны = ШаблоныНаименований();
	
	ИспользуетсяПериод = ИмяШаблона = "НаименованиеПериод" Или ИмяШаблона = "НаименованиеПериодФормат";
	Для Каждого СтрокаОтчет Из Объект.Отчеты Цикл
		Если ИспользуетсяПериод Тогда
			ИдентификаторСтроки = СтрокаОтчет.ПолучитьИдентификатор();
			Если Не СтрокаОтчет.ЕстьПериод Тогда
				СтрокаОтчет.ШаблонНаименования = Шаблоны.Получить("НаименованиеОтчетаФормат");
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		Если ЗначениеЗаполнено(ШаблонНаименования) Тогда
			СтрокаОтчет.ШаблонНаименования = ШаблонНаименования;
		Иначе
			СтрокаОтчет.ШаблонНаименования = Шаблоны.Получить(ИмяШаблона);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ШаблоныНаименований()

	Шаблоны = Новый Соответствие;
	Шаблоны.Вставить("НаименованиеОтчета", "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]");
	Шаблоны.Вставить("НаименованиеОтчетаФормат", "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "] [" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]");
	Шаблоны.Вставить("НаименованиеПериод", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 за %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.Период + "()]"));
	Шаблоны.Вставить("НаименованиеПериодФормат", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 за %2 %3'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.Период + "()]", "[" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]"));
	Шаблоны.Вставить("НаименованиеДатаРассылки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаРассылки + "()]"));
	Шаблоны.Вставить("НаименованиеДатаРассылкиФормат", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 от %2 %3'"), "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "]",
			"[" + ПараметрыТекстаПисьмаИФайлов.ДатаРассылки + "()]", "[" + ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]"));

	Возврат Шаблоны;

КонецФункции

&НаКлиенте
Процедура ПослеЗакрытияПовторнойРассылки(Результат, Параметры) Экспорт
	
	Прочитать();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытииПредпросмотраШаблона()
	ДобавитьШаблон();
	ПараметрыФормы = ПараметрыФормыПредпросмотраШаблона();
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПредварительныйПросмотрПисьма", ПараметрыФормы, ЭтотОбъект, , , , ,
		РежимОткрытияОкнаФормы.Независимый);

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент, Сервер

&НаКлиентеНаСервереБезКонтекста
Функция ПарольСкрыт()
	Возврат "********";
КонецФункции

// Параметры:
//  Форма - ФормаКлиентскогоПриложения:
//    * Расписание - РасписаниеРегламентногоЗадания
//  Изменения - Строка 
//
&НаКлиентеНаСервереБезКонтекста
Процедура ВидимостьДоступностьКорректность(Форма, Изменения = "")
	
	Объект = Форма.Объект;
	Элементы = Форма.Элементы;
	
	Если Изменения = "" Или Изменения = "FTPСерверИКаталог" Тогда
		Если ЗначениеЗаполнено(Объект.FTPСервер) Тогда
			ПредставлениеАдреса = "ftp://";
			Если ЗначениеЗаполнено(Объект.FTPЛогин) Тогда
				ПредставлениеАдреса = ПредставлениеАдреса + Объект.FTPЛогин + ?(ЗначениеЗаполнено(Форма.FTPПароль), ":" + ПарольСкрыт(), "") + "@";
			КонецЕсли;
			Форма.FTPСерверИКаталог = ПредставлениеАдреса + Объект.FTPСервер + ":" + Формат(Объект.FTPПорт, "ЧН=0; ЧГ=0") + Объект.FTPКаталог;
		Иначе
			Форма.FTPСерверИКаталог = "";
		КонецЕсли;
	КонецЕсли;
	
	Если Изменения = ""
		Или Изменения = "Подготовлена"
		Или Изменения = "ВыполнятьПоРасписанию"
		Или Изменения = "ВидРассылки"
		Или Изменения = "Публиковать"
		Или Изменения = "ИспользоватьЭлектроннуюПочту" Тогда
		
		Элементы.Отчеты.АвтоОтметкаНезаполненного         = Объект.Подготовлена;
		Элементы.ФорматыОтчетов.АвтоОтметкаНезаполненного = Объект.Подготовлена;
		
		Элементы.ПериодичностьРасписания.АвтоОтметкаНезаполненного = Объект.Подготовлена И Объект.ВыполнятьПоРасписанию;
		
		Элементы.СетевойКаталогWindows.АвтоОтметкаНезаполненного = Объект.Подготовлена И Форма.Публиковать;
		Элементы.СетевойКаталогLinux.АвтоОтметкаНезаполненного   = Объект.Подготовлена И Форма.Публиковать;
		Элементы.FTPСерверИКаталог.АвтоОтметкаНезаполненного     = Объект.Подготовлена И Форма.Публиковать;
		Элементы.Папка.АвтоОтметкаНезаполненного                 = Объект.Подготовлена И Форма.Публиковать;
		
		Элементы.ВидПочтовогоАдресаАвтора.АвтоОтметкаНезаполненного = Объект.Подготовлена И Объект.Личная;
		Элементы.УчетнаяЗапись.АвтоОтметкаНезаполненного = Объект.Подготовлена И Объект.ИспользоватьЭлектроннуюПочту;
		
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ВидРассылки" Тогда
		// Корректность
		Если Объект.Личная И Объект.Персонализирована Тогда
			Объект.Личная = Ложь;
		КонецЕсли;
		
		ГруппаВходитВИерархиюЛичныхРассылок = ПринадлежитГруппеЛичныхРассылок(Объект.Родитель);
		Если Объект.Личная <> ГруппаВходитВИерархиюЛичныхРассылок Тогда
			УстановитьМодифицированностьФормы(Форма, "Родитель", , 
				НСтр("ru = 'Группа установлена в соответствии с видом рассылки.'"));
			Объект.Родитель = ?(Объект.Личная, Форма.Кэш.ГруппаЛичныхРассылок, Неопределено);
		КонецЕсли;
		
		Если Объект.Личная Тогда
			РассылкаОбщая = Ложь;
			Форма.ВидРассылки = "Личная";
		ИначеЕсли Объект.Персонализирована Тогда
			РассылкаОбщая = Ложь;
			Форма.ВидРассылки = "Персонализирована";
		Иначе
			РассылкаОбщая = Истина;
			Форма.ВидРассылки = "Общая";
		КонецЕсли;
		
		Если Не РассылкаОбщая Тогда
			Объект.ИспользоватьПапку            = Ложь;
			Объект.ИспользоватьСетевойКаталог   = Ложь;
			Объект.ИспользоватьFTPРесурс        = Ложь;
			Объект.ИспользоватьЭлектроннуюПочту = Истина;
		КонецЕсли;
		
		// Видимость & Доступность
		Элементы.ВидыРассылки.ТекущаяСтраница = ?(Объект.Личная, Элементы.ВидыРассылкиЛичная, 
			Элементы.ВидыРассылкиДляПолучателей);
		Элементы.ДругиеСпособыДоставки.Видимость = РассылкаОбщая;
		Элементы.ИспользоватьЭлектроннуюПочту.Видимость = РассылкаОбщая;
		
		Если Объект.Личная Тогда
			Элементы.ПолучателиРассылки.Видимость = Ложь;
		Иначе
			Элементы.ПолучателиРассылки.Видимость = Истина;
			Если Не РассылкаОбщая Тогда
				Элементы.ПолучателиРассылки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
			Иначе
				Элементы.ПолучателиРассылки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			КонецЕсли;
		КонецЕсли;
		
		// Восстановление параметров
		Если Объект.ИспользоватьПапку Тогда
			Форма.ДругойСпособДоставки = "ИспользоватьПапку";
			Форма.Публиковать = Истина;
		ИначеЕсли Объект.ИспользоватьСетевойКаталог Тогда
			Форма.ДругойСпособДоставки = "ИспользоватьСетевойКаталог";
			Форма.Публиковать = Истина;
		ИначеЕсли Объект.ИспользоватьFTPРесурс Тогда
			Форма.ДругойСпособДоставки = "ИспользоватьFTPРесурс";
			Форма.Публиковать = Истина;
		Иначе
			Форма.ДругойСпособДоставки = Элементы.ДругойСпособДоставки.СписокВыбора[0].Значение;
			Форма.Публиковать = Ложь;
		КонецЕсли;
		
		Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета1.Видимость = Объект.Персонализирована;
		Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета2.Видимость = Объект.Персонализирована;
		Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета3.Видимость = Объект.Персонализирована;
		Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета4.Видимость = Объект.Персонализирована;
		
		ВидимостьДоступностьПаролейСертификатов(Форма);
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "Отчеты" Тогда
		КоличествоОтчетов = Форма.Объект.Отчеты.Количество();
		Если КоличествоОтчетов > 0 Тогда
			Элементы.СтраницаОтчеты.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Отчеты (%1)'"), 
				Формат(КоличествоОтчетов, "ЧН=0; ЧГ="));
		Иначе
			Элементы.СтраницаОтчеты.Заголовок = НСтр("ru = 'Отчеты'") ;
		КонецЕсли;
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ДругойСпособДоставки" Или Изменения = "Публиковать" Или Изменения = "ВидРассылки" Тогда
		Элементы.ДругойСпособДоставки.Доступность  = Форма.Публиковать;
		Элементы.ПараметрыДоставки.Доступность     = Форма.Публиковать;
		Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы[Форма.ДругойСпособДоставки];
		
		Элементы.Папка.Видимость = (Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы.ИспользоватьПапку);
		Элементы.СетевойКаталогWindows.Видимость = (Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы.ИспользоватьСетевойКаталог);
		Элементы.СетевойКаталогLinux.Видимость = (Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы.ИспользоватьСетевойКаталог);
		Элементы.FTPСерверИКаталог.Видимость = (Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы.ИспользоватьFTPРесурс);
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ИспользоватьЭлектроннуюПочту" Или Изменения = "ВидРассылки" Тогда
		Элементы.ГруппаУчетнаяЗапись.Доступность = Объект.ИспользоватьЭлектроннуюПочту;
		Элементы.ПараметрыПисьма.Доступность = Объект.ИспользоватьЭлектроннуюПочту;
		Элементы.ДополнительныеПараметрыРассылкиПоЭлектроннойПочте.Доступность = Объект.ИспользоватьЭлектроннуюПочту;
		Элементы.ПолучателиРассылки.Доступность = Объект.ИспользоватьЭлектроннуюПочту;
		Элементы.ПрикреплятьОтчетыВоВложения.Доступность = Объект.ИспользоватьЭлектроннуюПочту;
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ИспользоватьЭлектроннуюПочту" Или Изменения = "ВидРассылки"
		Или Изменения = "ПрикреплятьОтчетыВоВложения" Или Изменения = "Публиковать" Или Изменения = "ТолькоУведомить" Тогда
		Элементы.НастройкиФайловОтчетов.Доступность = Объект.ПрикреплятьОтчетыВоВложения Или Форма.Публиковать;
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ПолучателиРассылки" Тогда
		Если Форма.ВидРассылки <> "Личная" Тогда
			ПредставлениеПолучателей = ПредставлениеПолучателей(Форма);
			Форма.ПолучателиРассылки = ПредставлениеПолучателей.Краткое;
		КонецЕсли;
	КонецЕсли;
	
	Если Изменения = ""
		Или Изменения = "ТолькоУведомить"
		Или Изменения = "ИспользоватьЭлектроннуюПочту"
		Или Изменения = "ДругойСпособДоставки"
		Или Изменения = "Публиковать"
		Или Изменения = "ВидРассылки" Тогда
		
		Элементы.ТолькоУведомить.Видимость = (Объект.ИспользоватьЭлектроннуюПочту И Форма.Публиковать);
		Если Не Элементы.ТолькоУведомить.Видимость Тогда
			Объект.ТолькоУведомить = Ложь;
		КонецЕсли;
		
		СпособыДоставки = "";
		Если Объект.ИспользоватьПапку Тогда
			СпособыДоставки = НСтр("ru = 'папка'");
		КонецЕсли;
		Если Объект.ИспользоватьСетевойКаталог Тогда
			СпособыДоставки = НСтр("ru = 'сетевой каталог'");
		КонецЕсли;
		Если Объект.ИспользоватьFTPРесурс Тогда
			СпособыДоставки = НСтр("ru = 'FTP'");
		КонецЕсли;
		Если Объект.ИспользоватьЭлектроннуюПочту И Не Объект.ТолькоУведомить Тогда
			СпособыДоставки = СпособыДоставки + ?(СпособыДоставки = "", НСтр("ru = 'эл. почта'"), " "+ НСтр("ru = 'и эл. почта'"));
		КонецЕсли;
		
		Элементы.СтраницаДоставка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Доставка (%1)'"), СпособыДоставки);
	КонецЕсли;
	
	Если ПустаяСтрока(Изменения) Или СтрСравнить(Изменения, "ПисьмоВФорматеHTML") = 0 Тогда
		
		Элементы.СтраницыТекстПисьма.ТекущаяСтраница = ?(Объект.ПисьмоВФорматеHTML,
			Элементы.СтраницыТекстПисьмаHTML, Элементы.СтраницыТекстПисьмаОбычныйТекст);
		
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "Архивировать" Тогда
		Элементы.ИмяАрхива.Доступность           = Объект.Архивировать;
		Элементы.ПарольАрхива.Доступность        = Объект.Архивировать;
		Элементы.СоздатьПарольАрхива.Доступность = Объект.Архивировать;
		ВидимостьДоступностьПаролейСертификатов(Форма);
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ВыполнятьПоРасписанию" Тогда
		Если Объект.ВыполнятьПоРасписанию Тогда
			Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (активно)'");
		Иначе
			Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (не активно)'");
		КонецЕсли;
		Элементы.ПараметрыВыполненияПоРасписанию.Доступность = Объект.ВыполнятьПоРасписанию;
		Элементы.СтраницыПериодичности.Доступность           = Объект.ВыполнятьПоРасписанию;
		Элементы.ГруппаВремяВыполнения.Доступность           = Объект.ВыполнятьПоРасписанию;
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ПериодичностьРасписания" Тогда
		
		Если Объект.ПериодичностьРасписания = ПредопределенноеЗначение("Перечисление.ПериодичностиРасписанийРассылокОтчетов.Ежедневно") Тогда
			ИмяПеречисления = "Ежедневно";
		ИначеЕсли Объект.ПериодичностьРасписания = ПредопределенноеЗначение("Перечисление.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно") Тогда
			ИмяПеречисления = "Ежемесячно";
		ИначеЕсли Объект.ПериодичностьРасписания = ПредопределенноеЗначение("Перечисление.ПериодичностиРасписанийРассылокОтчетов.Еженедельно") Тогда
			ИмяПеречисления = "Еженедельно";
		Иначе
			ИмяПеречисления = "Произвольное";
		КонецЕсли;
		
		Страницы = Элементы.СтраницыПериодичности.ПодчиненныеЭлементы;
		ИмяВидимойСтраницы = "Страница"+ИмяПеречисления;
		Для Каждого Страница Из Страницы Цикл
			Страница.Видимость = (Страница.Имя = ИмяВидимойСтраницы);
		КонецЦикла;
		Если ИмяПеречисления = "Произвольное" Тогда
			Элементы.ИзменитьРасписание.Видимость = Истина;
			Элементы.ГруппаВремяВыполнения.Видимость = Ложь;
		Иначе
			Элементы.ИзменитьРасписание.Видимость = Ложь;
			Элементы.ГруппаВремяВыполнения.Видимость = Истина;
		КонецЕсли;
		
		// Сброс параметров, которые не соответствуют закладкам упрощенного редактирования.
		Если Изменения = "ПериодичностьРасписания"
			И (ИмяПеречисления = "Ежедневно" 
			Или ИмяПеречисления = "Еженедельно"
			Или ИмяПеречисления = "Ежемесячно") Тогда
			
			// Общие параметры
			Форма.Расписание.ДатаНачала = '00010101';
			Форма.Расписание.ДатаКонца  = '00010101';
			Форма.Расписание.ВремяЗавершения = '00010101';
			Форма.Расписание.ДеньНеделиВМесяце = 0;
			Форма.Расписание.ДетальныеРасписанияДня = Новый Массив;
			Форма.Расписание.ИнтервалЗавершения = 0;
			Форма.Расписание.ПаузаПовтора = 0;
			Форма.Расписание.ПериодНедель = 0;
			
			Если ИмяПеречисления <> "Ежедневно" Тогда
				Форма.Расписание.ПериодПовтораДней = 1;
			КонецЕсли;
			
			Если ИмяПеречисления <> "Еженедельно" Тогда
				ВыбранныеДниНедели = Новый Массив;
				Для Индекс = 1 По 7 Цикл
					ВыбранныеДниНедели.Добавить(Индекс);
				КонецЦикла;
				Форма.Расписание.ДниНедели = ВыбранныеДниНедели;
			КонецЕсли;
			
			Если ИмяПеречисления <> "Ежемесячно" Тогда
				ВсеМесяцы = Новый Массив;
				Для Индекс = 1 По 12 Цикл
					ВсеМесяцы.Добавить(Индекс);
				КонецЦикла;
				Форма.Расписание.Месяцы = ВсеМесяцы;
				Форма.Расписание.ДеньВМесяце = 0;
			КонецЕсли;
		КонецЕсли;
		
		// Восстанавливаем параметры на текущей закладке в соответствии с параметрами расписания.
		Если ИмяПеречисления = "Ежедневно" Тогда
			Форма.ВремяНачала = Форма.Расписание.ВремяНачала;
			Форма.ПериодПовтораДней = Форма.Расписание.ПериодПовтораДней;
		ИначеЕсли ИмяПеречисления = "Еженедельно" Тогда
			Форма.ВремяНачала = Форма.Расписание.ВремяНачала;
			Для Каждого КлючИЗначение Из Форма.Кэш.Соответствия.ДниНедели Цикл
				Форма[КлючИЗначение.Ключ] = (Форма.Расписание.ДниНедели.Найти(КлючИЗначение.Значение) <> Неопределено);
			КонецЦикла;
		ИначеЕсли ИмяПеречисления = "Ежемесячно" Тогда
			Форма.ВремяНачала = Форма.Расписание.ВремяНачала;
			Если Форма.Расписание.ДеньВМесяце >= 0 Тогда
				Форма.ДеньВМесяце = Форма.Расписание.ДеньВМесяце;
				Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'начала'");
			Иначе
				Форма.ДеньВМесяце = -Форма.Расписание.ДеньВМесяце;
				Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'конца'");
			КонецЕсли;
			Для Каждого КлючИЗначение Из Форма.Кэш.Соответствия.Месяцы Цикл
				Форма[КлючИЗначение.Ключ] = (Форма.Расписание.Месяцы.Найти(КлючИЗначение.Значение) <> Неопределено);
			КонецЦикла;
		КонецЕсли;
		Форма.ПериодПовтораВТечениеДня = СекундыВЧасы(Форма.Расписание.ПериодПовтораВТечениеДня);
		Форма.ВремяОкончания = Форма.Расписание.ВремяКонца;

		Форма.ИспользоватьПериодПовтораВТечениеДня = ЗначениеЗаполнено(Форма.ПериодПовтораВТечениеДня);
		
	КонецЕсли; // Изменения = "" Или Изменения = "ПериодичностьРасписания"

	Если Изменения = "" Или Изменения = "ПериодПовтораВТечениеДня" Или Изменения = "ПериодичностьРасписания" Тогда
		Элементы.ПериодПовтораВТечениеДня.Доступность = Форма.ИспользоватьПериодПовтораВТечениеДня;
		Элементы.ДекорацияЧасов.Доступность = Форма.ИспользоватьПериодПовтораВТечениеДня;
		Элементы.ВремяОкончания.Доступность = Форма.ИспользоватьПериодПовтораВТечениеДня;
		Форма.ВремяОкончания = ?(Форма.ИспользоватьПериодПовтораВТечениеДня, Форма.ВремяОкончания, '00010101');
		Форма.Расписание.ВремяКонца = Форма.ВремяОкончания;
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "НачалоКонецМесяца" Тогда
		Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = ?(Форма.Расписание.ДеньВМесяце >= 0, "начала", "конца");
	КонецЕсли;
	
	Если Изменения = "" Или Изменения = "ФорматыПоУмолчанию" Тогда
		Элементы.СброситьФорматПоУмолчанию.Видимость = (Форма.ФорматыПоУмолчанию <> Форма.СписокФорматовПоУмолчаниюПредставление);
	КонецЕсли;
	
	Если Изменения = "" Или Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРасписание Тогда
		Элементы.ПредставлениеРасписания.Видимость = Объект.ВыполнятьПоРасписанию;
		Если Объект.ВыполнятьПоРасписанию Тогда
			Элементы.ПредставлениеРасписания.Заголовок = ПредставлениеРасписания(Форма.Расписание);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВидимостьДоступностьПаролейСертификатов(Форма)
	Объект = Форма.Объект;
	Элементы = Форма.Элементы;

	Если Форма.ДоступноШифрованиеВложений Тогда
		Если Объект.Персонализирована Тогда
			Элементы["ГруппаСертификатДляШифрования"].Видимость = Ложь;
			Если Объект.Архивировать Тогда
				Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Установить пароли и зашифровать'");
			Иначе
				Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Зашифровать'");
			КонецЕсли;
			Элементы.ГруппаПаролиШифрование.Видимость = Истина;
			Элементы.ГруппаПарольАрхива.Видимость = Ложь;
			Элементы.ПаролиШифрование.Доступность = Объект.УстановитьПаролиЗашифровать;
			Элементы.ПаролиШифрование.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
			Элементы.ПаролиШифрование.РасширеннаяПодсказка.Заголовок = НСтр("ru = 'Установка и настройка паролей и шифрования.
				|При рассылке отчетов по электронной почте необходимо учитывать,
				|что некоторые почтовые сервера могут не принимать зашифрованные файлы.'");
			Элементы.УстановитьПаролиЗашифровать.Доступность = Истина;
		Иначе
			Элементы["ГруппаСертификатДляШифрования"].Видимость = ?(Форма.Объект.Личная, Истина, Ложь);
			Элементы.ГруппаПарольАрхива.Видимость = Истина;
			Элементы.ГруппаПаролиШифрование.Видимость = Ложь;
		КонецЕсли;
	Иначе
		Если Объект.Персонализирована Тогда
			Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Установить пароли'");
			Элементы.ГруппаПаролиШифрование.Видимость   = Истина;
			Элементы.ГруппаПарольАрхива.Видимость = Ложь;
			Элементы.ПаролиШифрование.Доступность = Объект.Архивировать И Объект.УстановитьПаролиЗашифровать;
			Элементы.ПаролиШифрование.ОтображениеПодсказки = ОтображениеПодсказки.Авто;
			Элементы.ПаролиШифрование.РасширеннаяПодсказка.Заголовок = НСтр("ru = 'Установка и настройка паролей.'");
			Элементы.УстановитьПаролиЗашифровать.Доступность = Объект.Архивировать;
		Иначе
			Элементы.ГруппаПарольАрхива.Видимость = Истина;
			Элементы.ГруппаПаролиШифрование.Видимость = Ложь;
			Если Элементы.Найти("ГруппаСертификатДляШифрования") <> Неопределено Тогда
				Элементы["ГруппаСертификатДляШифрования"].Видимость = Ложь;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

// Формирует представление расписания регламентного задания.
//
// Параметры:
//   Расписание - РасписаниеРегламентногоЗадания - расписание.
//
// Возвращаемое значение:
//   Строка - представление расписания.
//
&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРасписания(Расписание)
	ПредставлениеРасписания = Строка(Расписание);
	ПредставлениеРасписания = ВРег(Лев(ПредставлениеРасписания, 1)) + Сред(ПредставлениеРасписания, 2);
	ПредставлениеРасписания = СтрЗаменить(СтрЗаменить(ПредставлениеРасписания, "  ", " "), " ]", "]") + ".";
	Если ЗначениеЗаполнено(Расписание.ВремяНачала) Или ЗначениеЗаполнено(Расписание.ВремяКонца) Тогда
		Дополнение = ДополнениеПредставленияРасписанияВМоделиСервиса();
		ПредставлениеРасписания = ?(ЗначениеЗаполнено(Дополнение), ПредставлениеРасписания + Символы.ПС + Дополнение,
			ПредставлениеРасписания);
	КонецЕсли;
	Возврат ПредставлениеРасписания;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеПолучателей(Форма)
	Получатели  = Форма.Объект.Получатели;
	Включенные  = Получатели.НайтиСтроки(Новый Структура("Исключен", Ложь));
	Отключенные = Получатели.НайтиСтроки(Новый Структура("Исключен", Истина));
	
	ПредставлениеОтключенных = РассылкаОтчетовКлиентСервер.ПредставлениеСписка(Отключенные, "Получатель", 0);
	Остаток       = 75 - ПредставлениеОтключенных.ДлинаКраткого;
	Представление = РассылкаОтчетовКлиентСервер.ПредставлениеСписка(Включенные, "Получатель", Остаток);
	
	ПараметрыПолучателей = РассылкаОтчетовКлиентСервер.ПараметрыПолучателей();
	ПараметрыПолучателей.Ссылка = Форма.Объект.Ссылка;
	ПараметрыПолучателей.ВидПочтовогоАдресаПолучателей = Форма.Объект.ВидПочтовогоАдресаПолучателей;
	ПараметрыПолучателей.Личная = Форма.Объект.Личная;
	ПараметрыПолучателей.ТипПолучателейРассылки = Форма.Объект.ТипПолучателейРассылки;
	ПараметрыПолучателей.Получатели = Форма.Объект.Получатели;
	
	КоличествоПолучателей = КоличествоПолучателейСУчетомГрупп(ПараметрыПолучателей);
	
	Если КоличествоПолучателей.Всего = 0 Тогда
		Представление.Краткое = НСтр("ru = '<Укажите получателей>'");
		Возврат Представление;
	КонецЕсли;
	
	Если ПредставлениеОтключенных.МаксимумПревышен Тогда
		ПредставлениеОтключенных.Краткое = ПредставлениеОтключенных.Краткое + ", ...";
	КонецЕсли;
	Если Представление.МаксимумПревышен Тогда
		Представление.Краткое = Представление.Краткое + ", ...";
	КонецЕсли;
	
	Если КоличествоПолучателей.Исключены <> Неопределено И КоличествоПолучателей.Исключены > 0 Тогда
		ШаблонРазделения = НСтр("ru = 'Кроме'")+ ": ";
		Представление.Полное = Представление.Полное + ";" + Символы.ПС + ШаблонРазделения + ПредставлениеОтключенных.Полное;
		Если Представление.ДлинаКраткого + ПредставлениеОтключенных.ДлинаКраткого <= 75 Тогда
			Представление.Краткое = Представление.Краткое + "; " + ШаблонРазделения + ПредставлениеОтключенных.Краткое;
		КонецЕсли;
	КонецЕсли;
	Если Представление.МаксимумПревышен
		Или ПредставлениеОтключенных.МаксимумПревышен Тогда
		Если КоличествоПолучателей.Исключены <> Неопределено И КоличествоПолучателей.Исключены > 0 Тогда
			ШаблонОкончания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '(всего %1, исключая %2)'"),
				КоличествоПолучателей.Всего,
				КоличествоПолучателей.Исключены);
		Иначе
			ШаблонОкончания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '(всего %1)'"),
				КоличествоПолучателей.Всего);
		КонецЕсли;
		Представление.Краткое = Представление.Краткое + "; " + ШаблонОкончания;
	КонецЕсли;
	
	Возврат Представление;
КонецФункции

&НаСервереБезКонтекста
Функция КоличествоПолучателейСУчетомГрупп(ПараметрыПолучателей)

	Возврат Справочники.РассылкиОтчетов.КоличествоПолучателейСУчетомГрупп(ПараметрыПолучателей);

КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьМодифицированностьФормы(Форма, Поле = "", ПутьКДанным = "", Текст = "")
	Если Не Форма.Модифицированность Тогда
		Форма.ФормаБылаМодифицированаНаСервере = Истина;
		Если ЗначениеЗаполнено(Текст) Тогда
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = Текст;
			Сообщение.Поле = Поле;
			Сообщение.ПутьКДанным = ПутьКДанным;
			Сообщение.Сообщить();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеФорматовПоУмолчанию()
	Возврат НСтр("ru = 'по умолчанию'");
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПолучателиУказаны(Получатели)
	
	Для Каждого СтрокаТаблицы Из Получатели Цикл
		Если Не СтрокаТаблицы.Исключен Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	ТекстСообщения = НСтр("ru = 'Не выбрано ни одного получателя.'");
	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = ТекстСообщения;
	Сообщение.Поле = "ПолучателиРассылки";
	Сообщение.Сообщить();
	
	Возврат Ложь;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов)
	
	Возврат "[" + ПараметрыТекстаПисьмаИФайлов.Получатель + "]";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЧасыВСекунды(Часы)
	Возврат Часы * 60 * 60;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СекундыВЧасы(Секунды)
	Возврат Секунды / 60 / 60;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Вызов сервера, Сервер

&НаСервереБезКонтекста
Функция ПочтовыеАдресаПолучателя(Получатель, СписокЗначений)
	
	Получатели = Новый Массив;
	Получатели.Добавить(Получатель);
	ТипыКонтактнойИнформации = Новый Массив;
	ТипыКонтактнойИнформации.Добавить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
	Попытка
		ПочтовыеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(Получатели, ТипыКонтактнойИнформации,, ТекущаяДатаСеанса());
	Исключение
		Возврат СписокЗначений;
	КонецПопытки;
	
	ПочтовыеАдресаПоВидам = Новый Соответствие;
	Для Каждого ПочтовыйАдрес Из ПочтовыеАдреса Цикл
		Если НЕ ЗначениеЗаполнено(ПочтовыйАдрес.Представление) Тогда 
			Продолжить;
		КонецЕсли;
		ПочтовыеАдресаВида = ПочтовыеАдресаПоВидам.Получить(ПочтовыйАдрес.Вид);
		Если ПочтовыеАдресаВида = Неопределено Тогда
			ПочтовыеАдресаПоВидам.Вставить(ПочтовыйАдрес.Вид, ПочтовыйАдрес.Представление);
		Иначе
			ПочтовыеАдресаПоВидам[ПочтовыйАдрес.Вид]= ПочтовыеАдресаВида + ", " + ПочтовыйАдрес.Представление;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Вид Из ПочтовыеАдресаПоВидам Цикл
		СписокЗначений.Добавить(Вид.Ключ, Вид.Значение + " (" + Строка(Вид.Ключ) + ")");
	КонецЦикла;
	
	Возврат СписокЗначений;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПравоИзмененияПапкиИФайлов(Папка)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
		МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный");
		Результат = МодульРаботаСФайламиСлужебный.ПравоДобавленияФайловВПапку(Папка);
	Иначе
		Результат = Истина;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция СоздатьПароль()
	
	СвойстваПароля = Пользователи.СвойстваПароля();
	СвойстваПароля.НаименьшаяДлина = 8;
	СвойстваПароля.Сложный = Истина;
	СвойстваПароля.УчестьНастройки = "ДляПользователей";
	
	Возврат Пользователи.СоздатьПароль(СвойстваПароля);
	
КонецФункции

&НаСервереБезКонтекста
Функция ДополнениеПредставленияРасписанияВМоделиСервиса()
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Возврат НСтр("ru = 'Точное время запуска может отличаться от указанного.'");
	Иначе
		Возврат "";
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, ДобавитьДежурнуюФразу = Истина, Знач ПользовательскиеНастройки = Неопределено)
	// Сохранение настроек предыдущего отчета.
	Если ИдентификаторСтроки <> ИдентификаторТекущейСтрокиТаблицыОтчетов И ИдентификаторТекущейСтрокиТаблицыОтчетов <> -1 Тогда
		ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторТекущейСтрокиТаблицыОтчетов);
	КонецЕсли;
	ИдентификаторТекущейСтрокиТаблицыОтчетов = ИдентификаторСтроки;
	
	// Поиск строки
	СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаОтчеты = Неопределено Тогда
		ИдентификаторТекущейСтрокиТаблицыОтчетов = -1;
		Возврат "";
	КонецЕсли;
	
	Если ПользовательскиеНастройки = Неопределено Тогда
		// Чтение настроек текущей строки из временного хранилища или из табличной части по ссылке.
		Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда
			ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек);
		Иначе
			ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты);
			ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки);
			ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить());
		КонецЕсли;
	КонецЕсли;
	
	Если Не СтрокаОтчеты.Доступность Тогда
		Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.ПустаяСтраница;
		Возврат "";
	КонецЕсли;
	
	// Инициализация
	ПараметрыОтчета = ИнициализироватьОтчет(СтрокаОтчеты, ДобавитьДежурнуюФразу, ПользовательскиеНастройки);
	
	НайтиНастройкиПерсонализации();
	
	Возврат ПараметрыОтчета.Ошибки;
КонецФункции

&НаСервере
Процедура НайтиНастройкиПерсонализации()
	
	НастройкиПерсонализации.Очистить();
	
	Настройки = КомпоновщикНастроекКД.ПользовательскиеНастройки.Элементы;
	
	Для Каждого ЭлементНастройки Из Настройки Цикл 
		
		ЗначениеНастройки = Неопределено;
		
		Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда 
			
			ЗначениеНастройки = ЭлементНастройки.ПравоеЗначение;
			
		ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда 
			
			ЗначениеНастройки = ЭлементНастройки.Значение;
		Иначе
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеНастройки <> ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов) Тогда 
			Продолжить;
		КонецЕсли;
		
		ЗаголовокНастройки = ЗаголовокНастройкиПерсонализации(ЭлементНастройки.ИдентификаторПользовательскойНастройки);
		
		Если ЗаголовокНастройки <> Неопределено Тогда 
			НастройкиПерсонализации.Добавить(ЗаголовокНастройки);
		КонецЕсли;
		
	КонецЦикла;
	
	ОформитьНастройкиПерсонализации();
	
КонецПроцедуры

&НаСервере
Функция ЗаголовокНастройкиПерсонализации(ИдентификаторНастройки)
	
	ЗаголовокНастройки = Неопределено;
	ОписаниеНастройки = Неопределено;
	
	Настройки = КомпоновщикНастроекКД.Настройки;
	ПользовательскиеНастройки = КомпоновщикНастроекКД.ПользовательскиеНастройки;
	
	НайденныеНастройки = ПользовательскиеНастройки.ПолучитьОсновныеНастройкиПоИдентификаторуПользовательскойНастройки(
		ИдентификаторНастройки);
	
	Если НайденныеНастройки.Количество() = 0 Тогда 
		Возврат ЗаголовокНастройки;
	КонецЕсли;
	
	ЭлементНастройки = НайденныеНастройки[0];
	
	Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда 
		
		ЗаголовокНастройки = Строка(ЭлементНастройки.ЛевоеЗначение);
		
		ОписаниеНастройки = Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(
			ЭлементНастройки.ЛевоеЗначение);
		
	ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда 
		
		ЗаголовокНастройки = Строка(ЭлементНастройки.Параметр);
		
		ОписаниеНастройки = Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(
			ЭлементНастройки.Параметр);
		
	КонецЕсли;
	
	Если ОписаниеНастройки <> Неопределено Тогда 
		ЗаголовокНастройки = ОписаниеНастройки.Заголовок;
	КонецЕсли;
	
	Возврат ЗаголовокНастройки;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьРасписаниеПоВарианту(Вариант, ОбновитьВидимость = Ложь)
	
	Расписание = Новый РасписаниеРегламентногоЗадания;
	Расписание.ВремяНачала = '00010101073000'; // в 7:30 утра
	Расписание.ПериодПовтораДней = 1; // каждый день

	// по дням недели
	ДеньНеделиМин = 1;
	ДеньНеделиМакс = 7;
	
	// по всем месяцам
	ВсеМесяцы = Новый Массив;
	Для Индекс = 1 По 12 Цикл
		ВсеМесяцы.Добавить(Индекс);
	КонецЦикла;
	Расписание.Месяцы = ВсеМесяцы;
	
	Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно;
	Если Вариант = 2 Тогда // "Каждый второй день"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно;
		Расписание.ПериодПовтораДней = 2;
		
	ИначеЕсли Вариант = 3 Тогда // "Каждый четвертый день"
		Расписание.ПериодПовтораДней = 4;
		
	ИначеЕсли Вариант = 4 Тогда // "По будням"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно;
		ДеньНеделиМин = 1;
		ДеньНеделиМакс = 5;
		
	ИначеЕсли Вариант = 5 Тогда // "По выходным"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно;
		Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера
		ДеньНеделиМин = 6;
		ДеньНеделиМакс = 7;
		
	ИначеЕсли Вариант = 6 Тогда // "По понедельникам"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно;
		ДеньНеделиМин = 1;
		ДеньНеделиМакс = 1;
		
	ИначеЕсли Вариант = 7 Тогда // "По пятницам"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно;
		ДеньНеделиМин = 5;
		ДеньНеделиМакс = 5;
		
	ИначеЕсли Вариант = 8 Тогда // "По воскресеньям"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно;
		Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера
		ДеньНеделиМин = 7;
		ДеньНеделиМакс = 7;
		
	ИначеЕсли Вариант = 9 Тогда // "В первый день месяца"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно;
		Расписание.ДеньВМесяце = 1;
		
	ИначеЕсли Вариант = 10 Тогда // "В последний день месяца"
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно;
		Расписание.ДеньВМесяце = -1;
		
	ИначеЕсли Вариант = 11 Тогда // СКаждый квартал десятого числа".
		ВсеМесяцы = Новый Массив;
		ВсеМесяцы.Добавить(1);
		ВсеМесяцы.Добавить(4);
		ВсеМесяцы.Добавить(7);
		ВсеМесяцы.Добавить(10);
		Расписание.Месяцы = ВсеМесяцы;
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно;
		Расписание.ДеньВМесяце = 10;
		
	ИначеЕсли Вариант = 12 Тогда // "Другое..."
		Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное;
	КонецЕсли;
	
	// по дням недели
	ВыбранныеДниНедели = Новый Массив;
	Для Индекс = ДеньНеделиМин По ДеньНеделиМакс Цикл
		ВыбранныеДниНедели.Добавить(Индекс);
	КонецЦикла;
	Расписание.ДниНедели = ВыбранныеДниНедели;
	
	Если ОбновитьВидимость Тогда
		ВидимостьДоступностьКорректность(ЭтотОбъект);
	КонецЕсли;
КонецПроцедуры

// Выполняет проверку выбранного отчета.
// 
// Параметры:
//   СтруктураВыбора - Структура:
//     * Выбрано   - Структура - строки, выбранные пользователем.
//     * Успешно   - Структура - строки, инициализированные и добавленные в список.
//     * СОшибками - Структура - строки, не добавленные в список из-за ошибок, где:
//         ** МассивСтрок - Массив - массив идентификаторов строк.
//         ** Количество - Число - количество строк.
//         ** ПредставлениеОтчетов - Строка - представление всех отчетов указанных строк.
//         ** Текст - Строка - текст возникших ошибок.
//
&НаСервере
Процедура ПроверитьДобавленныеСтрокиОтчетов(СтруктураВыбора)
	МассивОшибок = Новый Массив;
	
	СтруктураВыбора.Выбрано.Количество = СтруктураВыбора.Выбрано.МассивСтрок.Количество();
	Для ОбратныйИндекс = 1 По СтруктураВыбора.Выбрано.Количество Цикл
		Индекс = СтруктураВыбора.Выбрано.Количество - ОбратныйИндекс;
		ИдентификаторСтрокиОтчеты = СтруктураВыбора.Выбрано.МассивСтрок[Индекс];
		
		СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтрокиОтчеты);
		Если СтрокаОтчеты.Представление = "" Тогда
			СтрокаОтчеты.Представление = Строка(СтрокаОтчеты.Отчет);
		КонецЕсли;
		
		СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь);
		Если СтрокаПредупреждения = "" Тогда
			Ключ = "Успешно";
		Иначе
			Ключ = "СОшибками";
			МассивОшибок.Добавить(СтрокаПредупреждения);
		КонецЕсли;
		
		Строки = СтруктураВыбора[Ключ].МассивСтрок; // Массив
		Строки.Добавить(ИдентификаторСтрокиОтчеты);
		
		СтруктураВыбора[Ключ].МассивСтрок = Строки;
		СтруктураВыбора[Ключ].Количество = СтруктураВыбора[Ключ].Количество + 1;
		СтруктураВыбора[Ключ].ПредставлениеОтчетов = СтруктураВыбора[Ключ].ПредставлениеОтчетов
			+ ?(СтруктураВыбора[Ключ].ПредставлениеОтчетов = "", "", ", ")
			+ СтрокаОтчеты.Представление;
	КонецЦикла;
	
	// Установка курсора на первый из добавленных элементов.
	Если СтруктураВыбора.Успешно.Количество > 0 Тогда
		Элементы.Отчеты.ТекущаяСтрока = СтруктураВыбора.Успешно.МассивСтрок[0];
		ИдентификаторТекущейСтрокиТаблицыОтчетов = Элементы.Отчеты.ТекущаяСтрока;
		ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь);
	КонецЕсли;
	
	// Сборка текста ошибок.
	Если СтруктураВыбора.СОшибками.Количество > 0 Тогда
		СтруктураВыбора.СОшибками.Текст = РассылкаОтчетов.СтрокаСообщенийПользователю(МассивОшибок);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПроверитьСпособДоставки(Рассылка, Знач ПараметрыДоставки)
	
	ПараметрыДоставки.ДатаВыполнения = ТекущаяДатаСеанса();
	ПараметрыДоставки.РежимТестирования = Истина;
	
	// Инициализация параметров записи в журнал регистрации.
	УстановитьПривилегированныйРежим(Истина);
	
	ПараметрыЖурнала = Новый Структура;
	ПараметрыЖурнала.Вставить("ИмяСобытия",   НСтр("ru = 'Рассылка отчетов. Проверка способа доставки'", ОбщегоНазначения.КодОсновногоЯзыка()));
	ПараметрыЖурнала.Вставить("Данные",       Рассылка);
	ПараметрыЖурнала.Вставить("Метаданные",   Метаданные.Справочники.РассылкиОтчетов);
	ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив);
	
	УстановитьПривилегированныйРежим(Ложь);
	
	// Запись пустого табличного документа в html 5.
	ПолноеИмяФайла = ПолучитьИмяВременногоФайла(".html");
	
	ТабДок = Новый ТабличныйДокумент;
	ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML5);
	
	// Формирование вложений
	Файл = Новый Файл(ПолноеИмяФайла);
	
	Вложения = Новый Соответствие;
	Вложения.Вставить(Файл.Имя, Файл.ПолноеИмя);
	
	// Доставка
	НачатьТранзакцию(); // АПК:326 Транзакция открывается только для целей отмены.
	Попытка
		РассылкаОтчетов.ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, Вложения);
		ОтменитьТранзакцию(); // После окончания теста откатываются все изменения в базе.
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	// Очистка вложений
	Для Каждого Вложение Из Вложения Цикл
		УдалитьФайлы(Вложение.Значение);
	КонецЦикла;
	
	УдалитьФайлы(ПолноеИмяФайла);
	
	РезультатВыполнения = Новый Структура("Текст, Подробно", "", "");
	
	Если ПараметрыЖурнала.МассивОшибок.Количество() = 0 Тогда 
		РезультатВыполнения.Текст = НСтр("ru = 'Проверка возможности доставки успешно пройдена.'");
	Иначе
		РезультатВыполнения.Текст = НСтр("ru = 'Проверка возможности доставки не пройдена.'");
		РезультатВыполнения.Подробно = РассылкаОтчетов.СтрокаСообщенийПользователю(ПараметрыЖурнала.МассивОшибок, Ложь);
	КонецЕсли;
	
	Возврат РезультатВыполнения;
КонецФункции

&НаСервере
Функция ПоместитьПолучателейВХранилище()
	Возврат ПоместитьВоВременноеХранилище(Объект.Получатели.Выгрузить(), УникальныйИдентификатор);
КонецФункции

&НаСервере
Функция НаличиеПериодаВНастройках(ИдентификаторСтроки)

	СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда
		ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек);
	Иначе
		ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты);
		ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки);
		ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить());
	КонецЕсли;  
	
	Если ПользовательскиеНастройки = Неопределено Тогда
		ПараметрыОтчета = Новый Структура("Отчет, Настройки", СтрокаОтчеты.Отчет, Неопределено);
		ПараметрыЖурнала = Новый Структура;
		ПараметрыЖурнала.Вставить("ИмяСобытия",   НСтр("ru = 'Рассылка отчетов. Инициализация отчета'", ОбщегоНазначения.КодОсновногоЯзыка()));
		ПараметрыЖурнала.Вставить("Данные",       ?(ЗначениеЗаполнено(Объект.Ссылка), Объект.Ссылка, СтрокаОтчеты.Отчет));
		ПараметрыЖурнала.Вставить("Метаданные",   Метаданные.Справочники.РассылкиОтчетов);
		ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив);

		РассылкаОтчетов.ИнициализироватьОтчет(
			ПараметрыЖурнала,
			ПараметрыОтчета,
			Объект.Персонализирована,
			УникальныйИдентификатор);
		Если ПараметрыОтчета.НастройкиКД <> Неопределено Тогда
			ПользовательскиеНастройки = ПараметрыОтчета.НастройкиКД.ПараметрыДанных;
		КонецЕсли;
	КонецЕсли;
	
	Период = РассылкаОтчетов.ПолучитьПериодИзПользовательскихНастроек(ПользовательскиеНастройки);
	Если Период <> Неопределено Тогда
		Возврат Истина;
	КонецЕсли;

	Возврат Ложь;

КонецФункции

&НаСервере
Процедура ДобавитьДополнительныеПараметрыШаблона(ПараметрыШаблона, Получатель)

	Если ДополнительныеПараметрыТекстаПисьма = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДополнительныеПараметрыШаблона = Новый Структура;
	Для Каждого Параметр Из ДополнительныеПараметрыТекстаПисьма Цикл
		ДополнительныеПараметрыШаблона.Вставить(Параметр.Значение.Имя, "");
	КонецЦикла;
	
	РассылкаОтчетовПереопределяемый.ПриПолученииПараметровТекстаПисьма(ВидРассылки, ТипПолучателейРассылки, Получатель, ДополнительныеПараметрыШаблона);
	
	Для Каждого Параметр Из ДополнительныеПараметрыШаблона Цикл
		ПараметрыШаблона.Вставить(Параметр.Ключ, Параметр.Значение);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ПолучитьПервогоПолучателя()
	
	ПараметрыПолучателей = РассылкаОтчетовКлиентСервер.ПараметрыПолучателей();
	ПараметрыПолучателей.Получатели = Объект.Получатели;
	ПараметрыПолучателей.Автор = Объект.Автор;
	ПараметрыПолучателей.Личная = Объект.Личная;
	ПараметрыПолучателей.ТипПолучателейРассылки = Объект.ТипПолучателейРассылки;
	ПараметрыПолучателей.ВидПочтовогоАдресаПолучателей = Объект.ВидПочтовогоАдресаПолучателей;
	
	СписокПолучателейРассылки = РассылкаОтчетов.СформироватьСписокПолучателейРассылки(ПараметрыПолучателей, Неопределено);
	
	ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Объект.ТипПолучателейРассылки, Ложь);
	КлючОбъектаМетаданных = ?(ЗначениеЗаполнено(Объект.ТипПолучателейРассылки),
			ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ТипПолучателейРассылки, "КлючОбъектаМетаданных"), Неопределено);
	ТипПолучателей = ?(КлючОбъектаМетаданных <> Неопределено, КлючОбъектаМетаданных.Получить(), Неопределено);

	ПервыйПолучатель = Новый Структура ("Наименование, Ссылка", "", Новый (ТипПолучателей));
	
	Для Каждого Получатель Из СписокПолучателейРассылки Цикл
		ПервыйПолучатель.Ссылка = Получатель.Ключ;
		Прервать;
	КонецЦикла;
	
	Если ЗначениеЗаполнено(ПервыйПолучатель.Ссылка) Тогда
		ПервыйПолучатель.Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПервыйПолучатель.Ссылка, "Наименование");
	КонецЕсли;
	
	Возврат ПервыйПолучатель;
	
КонецФункции

&НаСервере
Функция ПлановыйСписокОтчетовВоВложениях()

	СписокИменФайлов = Новый Массив;
	ПараметрыДоставки = Новый Структура("ТранслитерироватьИменаФайлов", Объект.ТранслитерироватьИменаФайлов);

	// Параметры форматов.
	ПараметрыФорматов = Новый Соответствие;
	Для Каждого ФорматМД Из Метаданные.Перечисления.ФорматыСохраненияОтчетов.ЗначенияПеречисления Цикл
		Формат = Перечисления.ФорматыСохраненияОтчетов[ФорматМД.Имя];
		ПараметрыФормата = РассылкаОтчетов.ПараметрыЗаписиТабличногоДокументаВФормат(Формат);
		ПараметрыФормата.Вставить("Имя", ФорматМД.Имя);
		ПараметрыФорматов.Вставить(Формат, ПараметрыФормата);
	КонецЦикла;

	Для каждого СтрокаОтчет Из Объект.Отчеты Цикл
		ФорматыОтчета = Новый Массив;
		Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СтрокаОтчет.Отчет));

		Если Найденные.Количество() = 0 Тогда
			Для Каждого СтрокаФормат Из СписокФорматовПоУмолчанию Цикл
				Если НЕ СтрокаФормат.Пометка Тогда
					Продолжить;
				КонецЕсли;
				ФорматыОтчета.Добавить(СтрокаФормат.Значение);
			КонецЦикла;
		Иначе
			Для Каждого СтрокаФормат Из Найденные Цикл
				ФорматыОтчета.Добавить(СтрокаФормат.Формат);
			КонецЦикла;
		КонецЕсли;
		Если ЭтоАдресВременногоХранилища(СтрокаОтчет.АдресНастроек) Тогда
			ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчет.АдресНастроек);
		Иначе
			ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчет);
			ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки);
			ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить());
		КонецЕсли;
		Период = РассылкаОтчетов.ПолучитьПериодИзПользовательскихНастроек(ПользовательскиеНастройки);

		Для Каждого Формат Из ФорматыОтчета Цикл
			ПараметрыФормата = ПараметрыФорматов.Получить(Формат);
			ПолноеИмяФайла = РассылкаОтчетов.ПолноеИмяФайлаПоШаблону(
			"", СтрокаОтчет.Представление, ПараметрыФормата, ПараметрыДоставки, СтрокаОтчет.ШаблонНаименования, Период);

			// Механизм расширения
			РассылкаОтчетовПереопределяемый.ПередСохранениемТабличногоДокументаВФормат(
			Истина,
			Новый ТабличныйДокумент,
			Формат,
			ПолноеИмяФайла);

			СписокИменФайлов.Добавить(ПолноеИмяФайла);
		КонецЦикла;

	КонецЦикла;

	Возврат СписокИменФайлов;

КонецФункции

&НаСервереБезКонтекста
Функция ПоместитьКартинкиВоВременноеХранилище(КартинкиДляHTML)
	
	ТипСтрока = Новый ОписаниеТипов("Строка");
	
	Вложения = Новый ТаблицаЗначений;
	Вложения.Колонки.Добавить("АдресВоВременномХранилище", ТипСтрока);
	Вложения.Колонки.Добавить("Идентификатор", ТипСтрока);
	Вложения.Колонки.Добавить("Расширение", ТипСтрока);
	
	Для Каждого КартинкаДляHTML Из КартинкиДляHTML Цикл
		СтрокаВложение = Вложения.Добавить();
		ФайлВложение = КартинкаДляHTML.Значение.ПолучитьДвоичныеДанные();
		СтрокаВложение.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ФайлВложение);
		СтрокаВложение.Идентификатор = КартинкаДляHTML.Ключ;
		СтрокаВложение.Расширение = Строка(КартинкаДляHTML.Значение.Формат());
	КонецЦикла;
	
	Возврат ПоместитьВоВременноеХранилище(Вложения);
	
КонецФункции

&НаСервереБезКонтекста
Функция ПринадлежитГруппеЛичныхРассылок(Группа)
	
	Возврат РассылкаОтчетов.ПринадлежитГруппеЛичныхРассылок(Группа);
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Сервер

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	ЦветТекстаЗапрещеннойЯчейки = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение;
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НастройкиТекущегоОтчета.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НастройкиТекущегоОтчета.Обнаружен");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки);
	Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Отчеты.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФорматыОтчетов.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Отчеты.Доступность");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФорматыОтчетовШаблонНаименования.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Отчеты.ШаблонНаименования");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "";

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", "[" + ПараметрыТекстаПисьмаИФайлов.НаименованиеОтчета + "] [" 
		+ ПараметрыТекстаПисьмаИФайлов.ФорматОтчета + "]");

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФорматыОтчетовФорматы.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Отчеты.Форматы");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "";

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ПредставлениеФорматовПоУмолчанию());
	
	//
	
	ОформитьНастройкиПерсонализации();
	
КонецПроцедуры

&НаСервере
Процедура ОформитьНастройкиПерсонализации()
	
	Элемент = Неопределено;
	ПараметрОформления = Новый ПараметрКомпоновкиДанных("Текст");
	
	Для Каждого ЭлементОформления Из УсловноеОформление.Элементы Цикл 
		
		ЗначениеПараметра = ЭлементОформления.Оформление.НайтиЗначениеПараметра(ПараметрОформления);
		Если ЗначениеПараметра.Значение = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов) Тогда 
			
			Элемент = ЭлементОформления;
			Прервать;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если Элемент <> Неопределено Тогда 
		
		ОтборЭлемента = Элемент.Отбор.Элементы[0];
		ОтборЭлемента.ПравоеЗначение = НастройкиПерсонализации;
		Возврат;
		
	КонецЕсли;
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПользовательскиеНастройкиЗначение.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КомпоновщикНастроекКД.ПользовательскиеНастройки.Настройка");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	ОтборЭлемента.ПравоеЗначение = НастройкиПерсонализации;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьКэш()
	
	// Преобразование наименований в значения.
	ДниНедели = Новый Соответствие;
	ДниНедели.Вставить(Элементы.Понедельник.Имя, 1);
	ДниНедели.Вставить(Элементы.Вторник.Имя,     2);
	ДниНедели.Вставить(Элементы.Среда.Имя,       3);
	ДниНедели.Вставить(Элементы.Четверг.Имя,     4);
	ДниНедели.Вставить(Элементы.Пятница.Имя,     5);
	ДниНедели.Вставить(Элементы.Суббота.Имя,     6);
	ДниНедели.Вставить(Элементы.Воскресенье.Имя, 7);
	ДниНедели = Новый ФиксированноеСоответствие(ДниНедели);
	
	Месяцы = Новый Соответствие;
	Месяцы.Вставить(Элементы.Январь.Имя,   1);
	Месяцы.Вставить(Элементы.Февраль.Имя,  2);
	Месяцы.Вставить(Элементы.Март.Имя,     3);
	Месяцы.Вставить(Элементы.Апрель.Имя,   4);
	Месяцы.Вставить(Элементы.Май.Имя,      5);
	Месяцы.Вставить(Элементы.Июнь.Имя,     6);
	Месяцы.Вставить(Элементы.Июль.Имя,     7);
	Месяцы.Вставить(Элементы.Август.Имя,   8);
	Месяцы.Вставить(Элементы.Сентябрь.Имя, 9);
	Месяцы.Вставить(Элементы.Октябрь.Имя,  10);
	Месяцы.Вставить(Элементы.Ноябрь.Имя,   11);
	Месяцы.Вставить(Элементы.Декабрь.Имя,  12);
	Месяцы = Новый ФиксированноеСоответствие(Месяцы);
	
	// Умолчания для полей, поддерживающих шаблоны заполнения.
	Шаблоны = Новый ФиксированнаяСтруктура("Тема, Текст, ИмяАрхива",
		РассылкаОтчетовКлиентСервер.ШаблонТемы(ПараметрыТекстаПисьмаИФайлов),
		РассылкаОтчетов.ШаблонТекста(ПараметрыТекстаПисьмаИФайлов),
		РассылкаОтчетовКлиентСервер.ШаблонИмениАрхива(ПараметрыТекстаПисьмаИФайлов));
	
	// Структура кэша.
	Кэш = Новый Структура;
	Кэш.Вставить("ПустоеЗначениеОтчета", РассылкаОтчетов.ПустоеЗначениеОтчета());
	Кэш.Вставить("ГруппаЛичныхРассылок", Справочники.РассылкиОтчетов.ЛичныеРассылки);
	Кэш.Вставить("ЗаголовокСистемы", РассылкаОтчетов.ИмяЭтойИнформационнойБазы());
	Кэш.Вставить("Соответствия", Новый ФиксированнаяСтруктура("ДниНедели, Месяцы", ДниНедели, Месяцы));
	Кэш.Вставить("Шаблоны", Шаблоны);
	Кэш.Вставить("ИсключаемыеОтчеты", РассылкаОтчетовПовтИсп.ИсключаемыеОтчеты());
	
	Возврат Новый ФиксированнаяСтруктура(Кэш);
КонецФункции

&НаСервере
Процедура ЗаполнитьСведенияТаблицыОтчеты()
	ДоступностьОтчетов = ВариантыОтчетов.ДоступностьОтчетов(Объект.Отчеты.Выгрузить(, "Отчет").ВыгрузитьКолонку("Отчет"));
	Для Каждого СтрокаОтчеты Из Объект.Отчеты Цикл
		ИнформацияОбОтчете = ДоступностьОтчетов.Найти(СтрокаОтчеты.Отчет, "Ссылка");
		Если ИнформацияОбОтчете = Неопределено Тогда
			СтрокаОтчеты.Доступность = Ложь;
			СтрокаОтчеты.Представление = НСтр("ru = '<Недостаточно прав для работы с отчетом>'");
		Иначе
			СтрокаОтчеты.Доступность = ИнформацияОбОтчете.Доступен;
			СтрокаОтчеты.Представление = ИнформацияОбОтчете.Представление;
		КонецЕсли;
		СтрокаОтчеты.Форматы = "";
		Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СтрокаОтчеты.Отчет));
		Для Каждого СтрокаФормат Из Найденные Цикл
			СтрокаОтчеты.Форматы = СтрокаОтчеты.Форматы + ?(СтрокаОтчеты.Форматы = "", "", ", ") + Строка(СтрокаФормат.Формат);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьРасписаниеРегламентногоЗадания()
	УстановитьПривилегированныйРежим(Истина);
	ИдентификаторЗадания = ?(СозданКопированием, ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РассылкаОснование,
		"РегламентноеЗадание"), Объект.РегламентноеЗадание);
	Если ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор") Тогда
		Задание = РегламентныеЗаданияСервер.Задание(ИдентификаторЗадания);
		Если Задание <> Неопределено Тогда
			Расписание = Задание.Расписание;
			Если Объект.ПериодичностьРасписания <> Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное
				И Не ЗначениеЗаполнено(Расписание.ПериодПовтораВТечениеДня) Тогда
				Расписание.ВремяКонца = '00010101';
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьНастройкиОтчетовОбъектаКопирования()
	КоличествоСтрок = Объект.Отчеты.Количество();
	ОтчетыРассылкиОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РассылкаОснование, "Отчеты").Выгрузить();
	Для ОбратныйИндекс = 1 По КоличествоСтрок Цикл
		Индекс = КоличествоСтрок - ОбратныйИндекс;
		СтрокаОтчеты = Объект.Отчеты.Получить(Индекс);
		СтрокаОтчетыОбъектаКопирования = ОтчетыРассылкиОснования.Получить(Индекс);
		
		ПользовательскиеНастройкиКД = СтрокаОтчетыОбъектаКопирования.Настройки.Получить();
		
		СтрокаОтчеты.ВнесеныИзменения = Истина;
		
		ИдентификаторСтроки = СтрокаОтчеты.ПолучитьИдентификатор();
		СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, Истина, ПользовательскиеНастройкиКД);
		Если Индекс = 0 Тогда
			ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторТекущейСтрокиТаблицыОтчетов);
		КонецЕсли;
		Если СтрокаПредупреждения <> "" Тогда
			ОбщегоНазначения.СообщитьПользователю(СтрокаПредупреждения, , "Объект.Отчеты["+ Индекс +"].Представление");
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПодключитьКэшНастроекЭлектроннойПочты()
	// Подключение кэша типов получателей.
	ТаблицаТиповПолучателей.Загрузить(РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей());
	
	// Заполнение списка выбора типов получателей.
	Для Каждого СтрокаПолучатель Из ТаблицаТиповПолучателей Цикл
		Элементы.ТипПолучателейРассылки.СписокВыбора.Добавить(СтрокаПолучатель.ТипПолучателей, СтрокаПолучатель.Представление);
		Если СтрокаПолучатель.ИдентификаторОбъектаМетаданных = Объект.ТипПолучателейРассылки Тогда
			ТипПолучателейРассылки = СтрокаПолучатель.ТипПолучателей;
			Если Объект.ВидПочтовогоАдресаПолучателей.Пустая() И ЗначениеЗаполнено(СтрокаПолучатель.ОсновнойВидКИ) Тогда
				Объект.ВидПочтовогоАдресаПолучателей = СтрокаПолучатель.ОсновнойВидКИ;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПустыеШаблоныСтандартными(ТекущийОбъект)
	// Данные объекта
	Если ПустаяСтрока(ТекущийОбъект.ТемаПисьма) Тогда
		ТекущийОбъект.ТемаПисьма = Кэш.Шаблоны.Тема;
	КонецЕсли;
	Если ПустаяСтрока(ТекущийОбъект.ТекстПисьма) Тогда
		ТекущийОбъект.ТекстПисьма = Кэш.Шаблоны.Текст;
	КонецЕсли;
	Если ПустаяСтрока(ТекущийОбъект.ИмяАрхива) Тогда
		ТекущийОбъект.ИмяАрхива = Кэш.Шаблоны.ИмяАрхива;
	КонецЕсли;
	// Данные формы
	Если ПустаяСтрока(ТекстПисьмаФорматированныйДокумент.ПолучитьТекст()) Тогда
		ТекстПисьмаФорматированныйДокумент.Добавить(Кэш.Шаблоны.Текст, ТипЭлементаФорматированногоДокумента.Текст);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторСтроки)
	СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаОтчеты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не СтрокаОтчеты.Инициализирован Тогда
		СохраняемоеЗначение = Неопределено;
	ИначеЕсли СтрокаОтчеты.СКД Тогда
		СохраняемоеЗначение = КомпоновщикНастроекКД.ПользовательскиеНастройки;
	Иначе
		ИменаКолонок = "Реквизит, Представление, Значение, Использование";
		Отбор = Новый Структура("Обнаружен", Истина);
		СохраняемоеЗначение = НастройкиТекущегоОтчета.Выгрузить().Скопировать(Отбор, ИменаКолонок);
	КонецЕсли;
	
	Адрес = ?(ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек), СтрокаОтчеты.АдресНастроек, УникальныйИдентификатор);
	
	СтрокаОтчеты.АдресНастроек = ПоместитьВоВременноеХранилище(СохраняемоеЗначение, Адрес);
КонецПроцедуры

&НаСервере
Функция ИнициализироватьОтчет(СтрокаОтчеты, ДобавитьДежурнуюФразу, ПользовательскиеНастройки, Интерактивно = Истина)
	// Параметры журнала
	ПараметрыЖурнала = Новый Структура;
	ПараметрыЖурнала.Вставить("ИмяСобытия",   НСтр("ru = 'Рассылка отчетов. Инициализация отчета'", ОбщегоНазначения.КодОсновногоЯзыка()));
	ПараметрыЖурнала.Вставить("Данные",       ?(ЗначениеЗаполнено(Объект.Ссылка), Объект.Ссылка, СтрокаОтчеты.Отчет));
	ПараметрыЖурнала.Вставить("Метаданные",   Метаданные.Справочники.РассылкиОтчетов);
	ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив);
	
	// Инициализация отчета
	ПараметрыОтчета = Новый Структура("Отчет, Настройки", СтрокаОтчеты.Отчет, ПользовательскиеНастройки);
	РассылкаОтчетов.ИнициализироватьОтчет(
		ПараметрыЖурнала,
		ПараметрыОтчета,
		Объект.Персонализирована,
		УникальныйИдентификатор);
	
	ПараметрыОтчета.Вставить("МассивОшибок", ПараметрыЖурнала.МассивОшибок);
	ПараметрыОтчета.Ошибки = РассылкаОтчетов.СтрокаСообщенийПользователю(ПараметрыОтчета.МассивОшибок, ДобавитьДежурнуюФразу);
	
	Если ПараметрыОтчета.Инициализирован Тогда
		СтрокаОтчеты.СКД             = ПараметрыОтчета.СКД;
		СтрокаОтчеты.Инициализирован = ПараметрыОтчета.Инициализирован;
		СтрокаОтчеты.ПолноеИмя       = ПараметрыОтчета.ПолноеИмя;
		СтрокаОтчеты.КлючВарианта    = ПараметрыОтчета.КлючВарианта;
		// Поддержка возможности прямого выбора ссылок дополнительных отчетов в рассылках отчетов.
		Если ЗначениеЗаполнено(ПараметрыОтчета.СсылкаВарианта) Тогда
			СтрокаОтчеты.Отчет         = ПараметрыОтчета.СсылкаВарианта;
			СтрокаОтчеты.Представление = Строка(СтрокаОтчеты.Отчет);
		КонецЕсли;
	КонецЕсли;
	
	Если Не Интерактивно Тогда
		Возврат ПараметрыОтчета;
	КонецЕсли;
	
	// Проверка результата инициализации.
	Если Не СтрокаОтчеты.Инициализирован Тогда
		// Удаление строки.
		Объект.Отчеты.Удалить(СтрокаОтчеты);
		
		// Пустая страница настроек.
		Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.ПустаяСтраница;
		
		Возврат ПараметрыОтчета;
	КонецЕсли;
	
	// Восстановление настроек
	Если СтрокаОтчеты.СКД Тогда
		
		КомпоновщикНастроекКД = ПараметрыОтчета.КомпоновщикНастроекКД;
		Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.СтраницаКомпоновщик;
		
	Иначе
		
		// Очищаем & Восстанавливаем
		Если ТипЗнч(ПользовательскиеНастройки) = Тип("ТаблицаЗначений") Тогда
			НастройкиТекущегоОтчета.Загрузить(ПользовательскиеНастройки);
		Иначе
			НастройкиТекущегоОтчета.Очистить();
		КонецЕсли;
		
		Для Каждого КлючИЗначение Из ПараметрыОтчета.ДоступныеРеквизиты Цикл
			// Обновляем вычисляемые реквизиты.
			Найденные = НастройкиТекущегоОтчета.НайтиСтроки(Новый Структура("Реквизит", КлючИЗначение.Ключ));
			Если Найденные.Количество() = 0 Тогда
				СтрокаНастройка = НастройкиТекущегоОтчета.Добавить();
				СтрокаНастройка.Реквизит = КлючИЗначение.Ключ;
			Иначе
				СтрокаНастройка = Найденные[0];
			КонецЕсли;
			СтрокаНастройка.Представление = КлючИЗначение.Значение.Представление;
			СтрокаНастройка.Тип           = КлючИЗначение.Значение.Тип;
			СтрокаНастройка.Обнаружен     = Истина;
			СтрокаНастройка.ИндексКартинки = 3;
		КонецЦикла;
		
		// Отключаем необнаруженные строки.
		Найденные = НастройкиТекущегоОтчета.НайтиСтроки(Новый Структура("Обнаружен", Ложь));
		Для Каждого СтрокаНастройка Из Найденные Цикл
			СтрокаНастройка.Использование = Ложь;
			СтрокаНастройка.ИндексКартинки = 4;
		КонецЦикла;
		
		Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.СтраницаНастройкиТекущегоОтчета;
		
	КонецЕсли;
	
	Возврат ПараметрыОтчета;
КонецФункции

&НаСервере
Процедура ДобавитьНастройкиОтчетов(ПрисоединяемыеОтчеты)
	
	Для Каждого СтрокаОтчетыПараметры Из ПрисоединяемыеОтчеты Цикл
		Если СтрокаОтчетыПараметры.Свойство("ВариантСсылка")
			И ТипЗнч(СтрокаОтчетыПараметры.ВариантСсылка) = Тип("СправочникСсылка.ВариантыОтчетов")
			И СтрокаОтчетыПараметры.ВариантСсылка <> Справочники.ВариантыОтчетов.ПустаяСсылка() Тогда
			ВариантСсылка = СтрокаОтчетыПараметры.ВариантСсылка;
		Иначе
			ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(СтрокаОтчетыПараметры.ОтчетПолноеИмя);
			Если Не ПустаяСтрока(ОтчетИнформация.ТекстОшибки) Тогда
				Если Не ПустаяСтрока(ТекстВсплывающегоОповещенияПриОткрытии) Тогда
					ТекстВсплывающегоОповещенияПриОткрытии = ТекстВсплывающегоОповещенияПриОткрытии + Символы.ПС;
				КонецЕсли;
				ТекстВсплывающегоОповещенияПриОткрытии = ТекстВсплывающегоОповещенияПриОткрытии + ОтчетИнформация.ТекстОшибки;
			КонецЕсли;
			ВариантСсылка = ВариантыОтчетов.ВариантОтчета(ОтчетИнформация.Отчет, СтрокаОтчетыПараметры.КлючВарианта);
		КонецЕсли;
		
		Если ВариантСсылка.ПометкаУдаления Тогда
			Продолжить;
		КонецЕсли;
		
		Найденные = Объект.Отчеты.НайтиСтроки(Новый Структура("Отчет", ВариантСсылка));
		Если Найденные.Количество() > 0 Тогда
			СтрокаОтчеты = Найденные[0];
		Иначе
			СтрокаОтчеты = Объект.Отчеты.Добавить();
			СтрокаОтчеты.Отчет                = ВариантСсылка;
			СтрокаОтчеты.ОтправлятьЕслиПустой = Ложь;
			СтрокаОтчеты.НеОтправлятьПустой   = Истина;
			СтрокаОтчеты.Доступность          = Истина;
		КонецЕсли;
		
		СтрокаОтчеты.ВнесеныИзменения = Истина;
		
		Если Не ЭтоНовый Тогда
			Если Найденные.Количество() > 0 Тогда
				ШаблонСтрокиСообщения = НСтр("ru = 'Для отчета ""%1"" загружены новые пользовательские настройки.'");
			Иначе
				ШаблонСтрокиСообщения = НСтр("ru = 'Добавлен отчет ""%1"".'");
			КонецЕсли;
			ШаблонСтрокиСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтрокиСообщения, Строка(ВариантСсылка));
			Если Не ПустаяСтрока(ТекстВсплывающегоОповещенияПриОткрытии) Тогда
				ТекстВсплывающегоОповещенияПриОткрытии = ТекстВсплывающегоОповещенияПриОткрытии + Символы.ПС;
			КонецЕсли;
			ТекстВсплывающегоОповещенияПриОткрытии = ТекстВсплывающегоОповещенияПриОткрытии + ШаблонСтрокиСообщения;
			ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты);
		КонецЕсли;
		
		ПользовательскиеНастройкиКД = СтрокаОтчетыПараметры.Настройки;
		
		ИдентификаторСтроки = СтрокаОтчеты.ПолучитьИдентификатор();
		Элементы.Отчеты.ТекущаяСтрока = ИдентификаторСтроки;
		СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, Истина, ПользовательскиеНастройкиКД);
		Если СтрокаПредупреждения <> "" Тогда
			ОбщегоНазначения.СообщитьПользователю(СтрокаПредупреждения, , "Объект.Отчеты["+ ИндексСтроки +"].Представление");
		Иначе
			ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторСтроки);
		КонецЕсли;
	КонецЦикла;
	
	ИдентификаторТекущейСтрокиТаблицыОтчетов = -1;
КонецПроцедуры

&НаСервере
Процедура СоздатьРеквизитЭлементСертификатДляШифрования()
	
	Если НЕ РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда
		ДоступноШифрованиеВложений = Ложь;
		Возврат;
	КонецЕсли;
	
	ДоступноШифрованиеВложений = Истина;
	
	Если Элементы.Найти("ГруппаСертификатДляШифрования") <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	МассивДобавляемыхРеквизитов = Новый Массив;
	МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СертификатДляШифрования",
		Новый ОписаниеТипов("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования"),,
		НСтр("ru = 'Сертификат для шифрования'")));
		
	ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
	
	Группа = Элементы.Добавить("ГруппаСертификатДляШифрования", Тип("ГруппаФормы"), Элементы.НастройкиФайловОтчетов);
	Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	Группа.Заголовок = НСтр("ru = 'Сертификат для шифрования'");
	Группа.ОтображатьЗаголовок = Ложь;
	Группа.РазрешитьИзменениеСостава = Ложь;
	Группа.Отображение = ОтображениеОбычнойГруппы.Нет;
	Группа.Объединенная = Истина;
	Группа.Поведение = ПоведениеОбычнойГруппы.Обычное;
	Группа.СквозноеВыравнивание = СквозноеВыравнивание.НеИспользовать;
	
	Элемент = Элементы.Добавить("СертификатДляШифрования", Тип("ПолеФормы"), Группа);
	Элемент.Заголовок = НСтр("ru = 'Сертификат для шифрования'");
	Элемент.ПутьКДанным = "СертификатДляШифрования";
	Элемент.Ширина = 70;
	Элемент.Вид = ВидПоляФормы.ПолеВвода;
	Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_СертификатДляШифрованияПриИзменении"); 
	Элемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
	Элемент.РасширеннаяПодсказка.Заголовок = НСтр("ru = 'При рассылке отчетов по электронной почте необходимо учитывать,
		|что некоторые почтовые сервера могут не принимать зашифрованные файлы.'");

КонецПроцедуры

&НаСервере
Процедура ОтобразитьВажность()

	Если Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.ВысокаяВажностьИнтернетПочтовогоСообщения() Тогда
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьВысокая;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Высокая важность'");
	ИначеЕсли Объект.ВажностьПисьма = РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.НизкаяВажностьИнтернетПочтовогоСообщения() Тогда
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНизкая;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Низкая важность'");
	Иначе
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Обычная важность'");
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ДобавитьКомандыДобавленияДополнительныхПараметровТекста()
	РассылкаОтчетов.ДобавитьКомандыДобавленияДополнительныхПараметровТекста(ЭтотОбъект);
	ОбновитьСписокПараметровТекстаПисьмаИФайлов();
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписокПараметровТекстаПисьмаИФайлов()
	ПараметрыТекстаПисьмаИФайлов = РассылкаОтчетовПовтИсп.ПараметрыТекстаПисьмаИФайлов();
	ТипПолучателейРассылки = ?(ВидРассылки = "Личная", Неопределено, ТипПолучателейРассылки);
	РассылкаОтчетовПереопределяемый.ПриОпределенииПараметровТекстаПисьма(ВидРассылки, ТипПолучателейРассылки, ПараметрыТекстаПисьмаИФайлов);
КонецПроцедуры

&НаСервере
Процедура ПроверитьНаличиеПериодовВОтчетах(МассивНовыхСтрок = Неопределено)
	
	Если МассивНовыхСтрок <> Неопределено Тогда 
		Для Каждого ИдентификаторСтроки Из МассивНовыхСтрок Цикл
			Если НаличиеПериодаВНастройках(ИдентификаторСтроки) Тогда
				СтрокаОтчет = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки);
				СтрокаОтчет.ЕстьПериод = Истина;
			КонецЕсли;
		КонецЦикла;
		Возврат;
	КонецЕсли;	
		
	Для Каждого СтрокаОтчет Из Объект.Отчеты Цикл
		ИдентификаторСтроки = СтрокаОтчет.ПолучитьИдентификатор();
		Если НаличиеПериодаВНастройках(ИдентификаторСтроки) Тогда
			СтрокаОтчет.ЕстьПериод = Истина;
		КонецЕсли;
	КонецЦикла; 

КонецПроцедуры

&НаСервере
Процедура УстановитьВидРассылки()
	
	Если РассылкаОтчетов.ПринадлежитГруппеЛичныхРассылок(Объект.Родитель)Тогда
		 ВидРассылки = "Личная";
		 Объект.Личная = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПреобразоватьПараметрыТекста(ТекущийОбъект, ВариантКонвертации)
	
	Если ВариантКонвертации = "ПараметрыВПредставление" Тогда
		ИмяПодстрокиПоиска = "Ключ";
		ИмяПодстрокиЗамены = "Значение";
	Иначе
		ИмяПодстрокиПоиска = "Значение";
		ИмяПодстрокиЗамены = "Ключ";
	КонецЕсли;
	
	ТекстHTML = "";
	СтруктураВложенийПисьмаВФорматеHTML = "";
	ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекстHTML, СтруктураВложенийПисьмаВФорматеHTML);
	Для каждого ОписаниеПараметра Из ПараметрыТекстаПисьмаИФайлов Цикл
		
		ПодстрокаПоиска = "[" + ОписаниеПараметра[ИмяПодстрокиПоиска];
		ПодстрокаЗамены = "[" + ОписаниеПараметра[ИмяПодстрокиЗамены];
		
		ТекущийОбъект.ТемаПисьма = СтрЗаменить(ТекущийОбъект.ТемаПисьма, ПодстрокаПоиска, ПодстрокаЗамены);
		ТекущийОбъект.ТекстПисьма = СтрЗаменить(ТекущийОбъект.ТекстПисьма, ПодстрокаПоиска, ПодстрокаЗамены);
		ТекущийОбъект.ТекстПисьмаВФорматеHTML = СтрЗаменить(ТекущийОбъект.ТекстПисьмаВФорматеHTML, ПодстрокаПоиска, ПодстрокаЗамены);
		ТекстHTML = СтрЗаменить(ТекстHTML, ПодстрокаПоиска, ПодстрокаЗамены);
		
		Элементы.ФорматыОтчетовШаблонНаименования.ПодсказкаВвода = СтрЗаменить(Элементы.ФорматыОтчетовШаблонНаименования.ПодсказкаВвода,
			ПодстрокаПоиска, ПодстрокаЗамены);
		
		Для Каждого СтрокаОтчет Из ТекущийОбъект.Отчеты Цикл
			СтрокаОтчет.ШаблонНаименования = СтрЗаменить(СтрокаОтчет.ШаблонНаименования, ПодстрокаПоиска, ПодстрокаЗамены);
		КонецЦикла;
		
		ТекущийОбъект.ИмяАрхива = СтрЗаменить(ТекущийОбъект.ИмяАрхива, ПодстрокаПоиска, ПодстрокаЗамены);
	
	КонецЦикла;

	Если ТекущийОбъект.ПисьмоВФорматеHTML Тогда
		ТекстПисьмаФорматированныйДокумент.УстановитьHTML(ТекстHTML, СтруктураВложенийПисьмаВФорматеHTML);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПреобразоватьПараметрыНастроекОтчетов(ТекущийОбъект, ВариантКонвертации)
	
	Если Не Объект.Персонализирована Тогда
		Возврат;
	КонецЕсли;
	
	Если ВариантКонвертации = "ПараметрыВПредставление" Тогда
		ПодстрокаПоиска = "[Получатель]";
		ПодстрокаЗамены = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
	Иначе
		ПодстрокаПоиска = ШаблонЗначенияПолучателяРассылки(ПараметрыТекстаПисьмаИФайлов);
		ПодстрокаЗамены = "[Получатель]";
	КонецЕсли;
	
	ВнесеныИзменения = Ложь;
	Для каждого СтрокаОтчеты Из Объект.Отчеты Цикл
		Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда
			ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек);
		Иначе
			ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты);
			ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки);
			ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить());
		КонецЕсли;
		
		Если ПользовательскиеНастройки = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ТипЗнч(ПользовательскиеНастройки) = Тип("ТаблицаЗначений") Тогда
			Для каждого ПользовательскаяНастройка Из ПользовательскиеНастройки Цикл
				Если СтрСравнить(ПользовательскаяНастройка.Значение, ПодстрокаПоиска) = 0 Тогда
					ПользовательскаяНастройка.Значение = СтрЗаменить(ПользовательскаяНастройка.Значение, ПодстрокаПоиска, ПодстрокаЗамены);
					ВнесеныИзменения = Истина;
				КонецЕсли;
			КонецЦикла;
		Иначе
			Для каждого ПользовательскаяНастройка Из ПользовательскиеНастройки.Элементы Цикл
				Если ТипЗнч(ПользовательскаяНастройка) = Тип("ЭлементОтбораКомпоновкиДанных")
				   И СтрСравнить(ПользовательскаяНастройка.ПравоеЗначение, ПодстрокаПоиска) = 0 Тогда
					ПользовательскаяНастройка.ПравоеЗначение = СтрЗаменить(ПользовательскаяНастройка.ПравоеЗначение, ПодстрокаПоиска, ПодстрокаЗамены);
					ВнесеныИзменения = Истина;
				ИначеЕсли ТипЗнч(ПользовательскаяНастройка) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") 
				   И СтрСравнить(ПользовательскаяНастройка.Значение, ПодстрокаПоиска) = 0 Тогда
					ПользовательскаяНастройка.Значение = СтрЗаменить(ПользовательскаяНастройка.Значение, ПодстрокаПоиска, ПодстрокаЗамены);
					ВнесеныИзменения = Истина;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		ОбъектСтрокаОтчеты = ТекущийОбъект.Отчеты.Получить(СтрокаОтчеты.НомерСтроки-1);
		
		Если ТипЗнч(ОбъектСтрокаОтчеты) = Тип("СправочникТабличнаяЧастьСтрока.РассылкиОтчетов.Отчеты") И ВнесеныИзменения Тогда
			ОбъектСтрокаОтчеты.Настройки = Новый ХранилищеЗначения(ПользовательскиеНастройки, Новый СжатиеДанных(9));
		ИначеЕсли ВнесеныИзменения Тогда
			Адрес = ?(ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек), СтрокаОтчеты.АдресНастроек, УникальныйИдентификатор);
			СтрокаОтчеты.АдресНастроек = ПоместитьВоВременноеХранилище(ПользовательскиеНастройки, Адрес);
		КонецЕсли;
		ВнесеныИзменения = Ложь;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ПараметрыФормыПредпросмотраШаблона()

	ПреобразоватьПараметрыТекста(Объект, "ПредставлениеВПараметры");
	
	КартинкиДляHTML = Новый Структура;
	
	Шаблон = Объект.ТекстПисьма;
	Если Объект.ПисьмоВФорматеHTML Тогда
		ТипТекста = ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.HTML");
		ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(Шаблон, КартинкиДляHTML);
		Шаблон = Объект.ТемаПисьма + "<br>" + "<br>" + Шаблон;
	Иначе
		ТипТекста = ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.ПростойТекст");
		Шаблон = Объект.ТемаПисьма + Символы.ПС + Символы.ПС + Шаблон;
	КонецЕсли;

	СформированныеОтчеты = "";
	Для Каждого СтрокаОтчет Из Объект.Отчеты Цикл
		ПредставлениеОтчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1. %2",
			СтрокаОтчет.НомерСтроки, СтрокаОтчет.Представление);
		СформированныеОтчеты = СформированныеОтчеты + Символы.ПС + ПредставлениеОтчета;
	КонецЦикла;
	СформированныеОтчеты = СокрЛП(СформированныеОтчеты);
	Если Объект.Архивировать Тогда
		СформированныеОтчеты = СформированныеОтчеты + Символы.ПС + Символы.ПС + НСтр(
			"ru = 'Файлы отчетов запакованы в архив'") + " ";

		СтруктураИмениАрхива = Новый Структура("НаименованиеРассылки, ДатаВыполнения", Объект.Наименование,
			ТекущаяДатаСеанса());
		ИмяАрхива = РассылкаОтчетовКлиентСервер.ЗаполнитьШаблон(Объект.ИмяАрхива, СтруктураИмениАрхива);
		ИмяАрхива = ИмяАрхива + ".zip";

		СформированныеОтчеты = СокрЛП(
				СформированныеОтчеты + """" + ИмяАрхива + """");
	КонецЕсли;

	ПараметрыДоставки = РассылкаОтчетовКлиентСервер.ПараметрыДоставки();
	ЗаполнитьЗначенияСвойств(ПараметрыДоставки, Объект);
	ПараметрыДоставки.ВыполненаВПапку = Объект.ИспользоватьПапку;
	ПараметрыДоставки.ВыполненаВСетевойКаталог = Объект.ИспользоватьСетевойКаталог;
	ПараметрыДоставки.ВыполненаНаFTP = Объект.ИспользоватьFTPРесурс;
	СпособДоставки = РассылкаОтчетовКлиентСервер.ПредставлениеСпособовДоставки(ПараметрыДоставки);
	
	ПараметрыШаблона = Новый Структура;
	ПараметрыШаблона.Вставить("НаименованиеРассылки", Объект.Наименование);
	ПараметрыШаблона.Вставить("Автор",                Объект.Автор);
	ПараметрыШаблона.Вставить("ЗаголовокСистемы",     Кэш.ЗаголовокСистемы);
	ПараметрыШаблона.Вставить("ДатаВыполнения",       ТекущаяДатаСеанса());
	ПараметрыШаблона.Вставить("СформированныеОтчеты", СформированныеОтчеты);
	ПараметрыШаблона.Вставить("СпособДоставки",       СпособДоставки);
	
	Если ВидРассылки = "Персонализирована" Тогда
		ПервыйПолучатель = ПолучитьПервогоПолучателя();
		ПараметрыШаблона.Вставить("Получатель", ПервыйПолучатель.Наименование);
		ПервыйПолучательСсылка = ПервыйПолучатель.Ссылка;
	Иначе
		ПервыйПолучательСсылка = Неопределено;
	КонецЕсли;
	ДобавитьДополнительныеПараметрыШаблона(ПараметрыШаблона, ПервыйПолучательСсылка);
	
	// Схематичное отображение отчетов в тексте письма
	Если Объект.ВставлятьОтчетыВТекстПисьма Тогда
		ОтчетыВТекстеПисьма = "";
		Для Каждого СтрокаОтчет Из Объект.Отчеты Цикл
			ОтчетыВТекстеПисьма = ОтчетыВТекстеПисьма + Символы.ПС
				+ "------------------------------------------" + Символы.ПС
				+ СтрокаОтчет.Представление;
		КонецЦикла;
		Если Объект.ПисьмоВФорматеHTML Тогда
			ОтчетыВТекстеПисьма = СтрЗаменить(ОтчетыВТекстеПисьма, Символы.ПС, Символы.ПС + "<br>");
		КонецЕсли;
		Шаблон = Шаблон + Символы.ПС + Символы.ПС + ОтчетыВТекстеПисьма;
	КонецЕсли;
	
	// Вывод списка вложений
	Если Объект.ПрикреплятьОтчетыВоВложения Тогда
		ПлановыйСписокОтчетов = ПлановыйСписокОтчетовВоВложениях();
		Если ПлановыйСписокОтчетов.Количество() > 0 Тогда
			СписокОтчетов = СтрСоединить(ПлановыйСписокОтчетов, Символы.ПС);

			ТекстВложения = Символы.ПС + Символы.ПС + НСтр("ru = 'Вложения письма:'");
			Если Объект.Архивировать Тогда
				СтруктураИмениАрхива = Новый Структура("НаименованиеРассылки, ДатаВыполнения", Объект.Наименование, ТекущаяДатаСеанса());
				ИмяАрхива = РассылкаОтчетовКлиентСервер.ЗаполнитьШаблон(Объект.ИмяАрхива, СтруктураИмениАрхива);
				ИмяАрхива = ИмяАрхива + ".zip";
				ТекстВложения = ТекстВложения + Символы.ПС + Символы.ПС + ИмяАрхива;
			Иначе
				ТекстВложения = ТекстВложения + Символы.ПС;
			КонецЕсли;
			НомерФайла = 1;
			Для Каждого ПолноеИмяФайла Из ПлановыйСписокОтчетов Цикл
				ИмяФайлаСПорядком = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1. %2",
					НомерФайла, ПолноеИмяФайла);
				Если Объект.ПисьмоВФорматеHTML Тогда
					ТекстВложения = ТекстВложения + "<p style=""margin-left: 50px;"">" + ИмяФайлаСПорядком + "</p>";
				Иначе
					ТекстВложения = ТекстВложения + Символы.ПС + Символы.Таб + ИмяФайлаСПорядком;
				КонецЕсли;
				НомерФайла = НомерФайла + 1;
			КонецЦикла;
			
			Если Объект.ПисьмоВФорматеHTML Тогда
				ТекстВложения = СтрЗаменить(ТекстВложения, Символы.ПС, Символы.ПС + "<br>");
			КонецЕсли;
			Шаблон = Шаблон + Символы.ПС + ТекстВложения;
		КонецЕсли;
	КонецЕсли;
	
	Текст = РассылкаОтчетовКлиентСервер.ЗаполнитьШаблон(Шаблон, ПараметрыШаблона);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("НаименованиеРассылки", Объект.Наименование);
	ПараметрыФормы.Вставить("ТипТекста", ТипТекста);
	ПараметрыФормы.Вставить("Текст", Текст);
	Если КартинкиДляHTML.Количество() > 0 Тогда
		ПараметрыФормы.Вставить("АдресКартинокДляHTML", ПоместитьКартинкиВоВременноеХранилище(КартинкиДляHTML));
	КонецЕсли;
		
	ПреобразоватьПараметрыТекста(Объект, "ПараметрыВПредставление");
	
	Возврат ПараметрыФормы;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Запись объекта

&НаКлиенте
Процедура ЗаписатьНаКлиенте(Результат, ПараметрыЗаписи) Экспорт
	// Инициализация параметров.
	Если Не ПараметрыЗаписи.Свойство("Шаг") Тогда
		ОчиститьСообщения(); // Очистка окна сообщений.
		ПараметрыЗаписи.Вставить("Шаг", 1);
	КонецЕсли;
	
	// Разрешения на ресурсы.
	Если ПараметрыЗаписи.Шаг = 1 И ТребуютсяРазрешенияНаРесурсыСервера() Тогда
		ПараметрыЗаписи.Шаг = 2;
		// Вопрос.
		Обработчик = Новый ОписаниеОповещения("ЗаписатьНаКлиенте", ЭтотОбъект, ПараметрыЗаписи);
		Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
			Разрешения = РазрешенияНаРесурсыСервера();
			МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент");
			МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Разрешения, ЭтотОбъект, Обработчик);
		Иначе
			ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК);
		КонецЕсли;
	ИначеЕсли ПараметрыЗаписи.Шаг = 1 Тогда
		// Вопрос не нужен.
		ПараметрыЗаписи.Шаг = 3;
	ИначеЕсли ПараметрыЗаписи.Шаг = 2 Тогда
		// Обработка ответа.
		Если Результат = КодВозвратаДиалога.ОК Тогда
			ПараметрыЗаписи.Шаг = 3; // Внешние ресурсы разрешены. Продолжить запись.
		Иначе
			Возврат; // Отменить запись.
		КонецЕсли;
	КонецЕсли;
	
	// Отключение архивации.
	Если ПараметрыЗаписи.Шаг = 3 И ЖелательноОтключитьАрхивацию() Тогда
		ПараметрыЗаписи.Шаг = 4;
		// Вопрос.
		ЗаголовокВопроса = НСтр("ru = 'Отключить архивацию'");
		ТекстВопроса = НСтр("ru = 'При публикации отчетов в папку рекомендуется отключать архивацию в ZIP.'");
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Отключить архивацию в ZIP'"));
		Кнопки.Добавить(КодВозвратаДиалога.Пропустить, НСтр("ru = 'Продолжить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		
		Обработчик = Новый ОписаниеОповещения("ЗаписатьНаКлиенте", ЭтотОбъект, ПараметрыЗаписи);
		ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да, ЗаголовокВопроса);
	ИначеЕсли ПараметрыЗаписи.Шаг = 3 Тогда
		// Вопрос не нужен.
		ПараметрыЗаписи.Шаг = 5;
	ИначеЕсли ПараметрыЗаписи.Шаг = 4 Тогда
		// Обработка ответа.
		Если Результат = КодВозвратаДиалога.Да Тогда
			Объект.Архивировать = Ложь; // Отключить архивацию.
			ПараметрыЗаписи.Шаг = 5; // Продолжить запись.
		ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда
			ПараметрыЗаписи.Шаг = 5; // Продолжить запись без отключения архивации.
		Иначе
			Возврат; // Отменить запись.
		КонецЕсли;
	КонецЕсли;
	
	// Запись.
	Если ПараметрыЗаписи.Шаг = 5 Тогда
		ПараметрыЗаписи.Шаг = 6;
		Успешно = Записать(ПараметрыЗаписи);
		Если Не Успешно Тогда
			Возврат; // Отменить запись.
		КонецЕсли;
		ИмяКоманды = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаписи, "ИмяКоманды");
		Если ИмяКоманды = "КомандаВыполнитьСейчас" Тогда
			ВыполнитьСейчас();
		ИначеЕсли ИмяКоманды = "КомандаЗаписатьИЗакрыть" Тогда
			Закрыть();
		ИначеЕсли ИмяКоманды = "КомандаСобытияРассылки" Тогда
			СобытияРассылки();
		ИначеЕсли ИмяКоманды = "КомандаПроверитьРассылку" Тогда
			ПроверитьРассылку(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаписи, "ПараметрыДоставки"));
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ТребуютсяРазрешенияНаРесурсыСервера()
	Если Объект.ИспользоватьСетевойКаталог
		И (ЗначениеЗаполнено(Объект.СетевойКаталогWindows) Или ЗначениеЗаполнено(Объект.СетевойКаталогLinux)) Тогда
		// Публикация в сетевой каталог. Требуются разрешения.
		Если ИзменилисьЗначенияРеквизитов("ИспользоватьСетевойКаталог, СетевойКаталогWindows, СетевойКаталогLinux") Тогда
			// Пользователь менял значения проверяемых реквизитов.
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	Если Объект.ИспользоватьFTPРесурс И ЗначениеЗаполнено(Объект.FTPСервер) Тогда
		// Публикация в сетевой каталог. Требуются разрешения.
		Если ИзменилисьЗначенияРеквизитов("ИспользоватьFTPРесурс, FTPСервер, FTPКаталог") Тогда
			// Пользователь менял значения проверяемых реквизитов.
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

&НаКлиенте
Функция ЖелательноОтключитьАрхивацию()
	Если Объект.ИспользоватьПапку
		И Объект.Архивировать
		И (Объект.ТолькоУведомить Или Не Объект.ИспользоватьЭлектроннуюПочту) Тогда
		// Публикация в папку с рассылкой уведомлений. Желательно отключить архивацию.
		Если ИзменилисьЗначенияРеквизитов("ИспользоватьПапку, ИспользоватьЭлектроннуюПочту, ТолькоУведомить, Архивировать") Тогда
			// Пользователь менял значения проверяемых реквизитов.
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

&НаСервере
Функция РазрешенияНаРесурсыСервера()
	РазрешенияНабор = РассылкаОтчетов.РазрешенияНаРесурсыСервера(Объект);
	МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
	РазрешенияСсылка = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(РазрешенияНабор, Объект.Ссылка);
	РазрешенияМассивСсылок = Новый Массив;
	РазрешенияМассивСсылок.Добавить(РазрешенияСсылка);
	Возврат РазрешенияМассивСсылок;
КонецФункции

&НаКлиенте
Функция ИзменилисьЗначенияРеквизитов(ИменаРеквизитов)
	ИменаРеквизитов = СтрРазделить(ИменаРеквизитов, ",", Ложь);
	Для Каждого ИмяРеквизита Из ИменаРеквизитов Цикл
		ИмяРеквизита = СокрЛП(ИмяРеквизита);
		Если Объект[ИмяРеквизита] <> ЗначенияРеквизитовДоИзменения[ИмяРеквизита] Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;
КонецФункции

&НаСервере
Процедура ЗафиксироватьЗначенияРеквизитовДоИзменения()
	
	ИменаРеквизитов = "ИспользоватьПапку, ИспользоватьЭлектроннуюПочту, ТолькоУведомить, Архивировать";
	ИменаРеквизитов = ИменаРеквизитов + ", ИспользоватьСетевойКаталог, СетевойКаталогWindows, СетевойКаталогLinux";
	ИменаРеквизитов = ИменаРеквизитов + ", ИспользоватьFTPРесурс, FTPСервер, FTPКаталог";
	ЗначенияРеквизитовДоИзменения = Новый Структура(ИменаРеквизитов);
	ЗаполнитьЗначенияСвойств(ЗначенияРеквизитовДоИзменения, Объект);
	ЗначенияРеквизитовДоИзменения = Новый ФиксированнаяСтруктура(ЗначенияРеквизитовДоИзменения);
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
    ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
		МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	КонецЕсли;
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

////////////////////////////////////////////////////////////////////////////////
// Копия команды "Выполнить сейчас" для поддержки асинхронности.

&НаКлиенте
Процедура ВыполнитьСейчас()
	МассивРассылок = Новый Массив;
	МассивРассылок.Добавить(Объект.Ссылка);
	
	ПараметрыЗапуска = Новый Структура("МассивРассылок, Форма, ЭтоФормаЭлемента");
	ПараметрыЗапуска.МассивРассылок = МассивРассылок;
	ПараметрыЗапуска.Форма = ЭтотОбъект;
	ПараметрыЗапуска.ЭтоФормаЭлемента = Истина;
	
	РассылкаОтчетовКлиент.ВыполнитьСейчас(ПараметрыЗапуска);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Копия команды "События рассылки..." для поддержки асинхронности.

&НаКлиенте
Процедура СобытияРассылки()
	ПараметрыФормыЖурналаРегистрации = ПараметрыЖурналаРегистрации(Объект.Ссылка);
	Если ПараметрыФормыЖурналаРегистрации = Неопределено Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Рассылка еще не выполнялась.'"));
		Возврат;
	КонецЕсли;
	ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормыЖурналаРегистрации, ЭтотОбъект);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПараметрыЖурналаРегистрации(Рассылка)
	Возврат РассылкаОтчетов.ПараметрыЖурналаРегистрации(Рассылка);
КонецФункции

#КонецОбласти